この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
| 
                    2_データ準備_keras [2017/11/05] adash333 [開発環境]  | 
                
                    2_データ準備_keras [2018/10/07] (現在) | 
            ||
|---|---|---|---|
| ライン 38: | ライン 38: | ||
| # convert class vectors to binary class matrices | # convert class vectors to binary class matrices | ||
| - | y_train = keras.utils.to_categorical(y_train, num_classes) | + | y_train = keras.utils.to_categorical(y_train, 10) | 
| - | y_test = keras.utils.to_categorical(y_test, num_classes) | + | y_test = keras.utils.to_categorical(y_test, 10) | 
| </code> | </code> | ||
| ライン 50: | ライン 50: | ||
| Keras 2.0.9\\ | Keras 2.0.9\\ | ||
| - | Keras2.0のインストール方法は[[windowsにkeras2.0をインストール]]をご覧下さい。 | + | Keras2.0のインストール方法は<wrap hi>[[windowsにkeras2.0をインストール]]</wrap>をご覧下さい。 | 
| - | このページは、[[(1)Kerasを使用するためのimport文]]の続きであり、今回は、MNISTのデータの準備・設定を行っていきます。 | + | このページは、<wrap hi>[[(1)Kerasを使用するためのimport文]]</wrap>の続きであり、今回は、MNISTのデータの準備・設定を行っていきます。 | 
| データの準備が難しいところなのですが、今回は、最初なので、Kerasであらかじめ用意されているMNISTデータセットを利用します。 | データの準備が難しいところなのですが、今回は、最初なので、Kerasであらかじめ用意されているMNISTデータセットを利用します。 | ||
| - | オリジナルデータセットの準備については、後日、[[Keras2用自前データの準備]]に記載予定です。 | + | オリジナルデータセットの準備については、後日、<wrap hi>[[Keras2用自前データの準備]]</wrap>に記載予定です。 | 
| ===== 手順 ===== | ===== 手順 ===== | ||
| ライン 68: | ライン 68: | ||
| <code> | <code> | ||
| - | from chainer.datasets import mnist | + | #2 データ準備(Keras)(MNISTの場合) | 
| + | # Kerasが用意しているMNISTデータセットをダウンロードしてx_train, y_train, x_test, y_testに代入 | ||
| + | # https://keras.io/ja/datasets/ を参照 | ||
| + | from keras.datasets import mnist | ||
| - | # データセットがダウンロード済みでなければ、ダウンロードも行う | + | (x_train, y_train), (x_test, y_test) = mnist.load_data() | 
| - | train, test = mnist.get_mnist(withlabel=True, ndim=1) | + | x_train = x_train.reshape(60000, 784) | 
| + | x_test = x_test.reshape(10000, 784) | ||
| + | x_train = x_train.astype('float32') | ||
| + | x_test = x_test.astype('float32') | ||
| + | x_train /= 255 | ||
| + | x_test /= 255 | ||
| + | |||
| + | # convert class vectors to binary class matrices | ||
| + | y_train = keras.utils.to_categorical(y_train, 10) | ||
| + | y_test = keras.utils.to_categorical(y_test, 10) | ||
| # matplotlibを使ったグラフ描画結果がnotebook内に表示されるようにします。 | # matplotlibを使ったグラフ描画結果がnotebook内に表示されるようにします。 | ||
| ライン 78: | ライン 90: | ||
| # データの例示 | # データの例示 | ||
| - | x, t = train[0] | + | x = x_train[0] | 
| + | t = np.argmax(y_train[0]) | ||
| plt.imshow(x.reshape(28, 28), cmap='gray') | plt.imshow(x.reshape(28, 28), cmap='gray') | ||
| plt.show() | plt.show() | ||
| ライン 84: | ライン 97: | ||
| </code> | </code> | ||
| - | 以下のような画面になります。(以下の画面は、2回目以降の画面となります。最初は、「Downloading from %%http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...%%」といった感じの文字が4行続くと思います。) | + | 以下のような画面になります。(以下の画面は、2回目以降の画面となります。最初は、「Downloading from %%http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...%%」といった感じの文字が4行続くかもしれません。) | 
| - | {{:pasted:20171103-211623.png}} | + | {{:pasted:20171106-051156.png}} | 
| + | |||
| + | {{:pasted:20171106-051215.png}} | ||
| 順に解説していきます。 | 順に解説していきます。 | ||
| <code> | <code> | ||
| - | from chainer.datasets import mnist | + | #2 データ準備(Keras)(MNISTの場合) | 
| + | # Kerasが用意しているMNISTデータセットをダウンロードしてx_train, y_train, x_test, y_testに代入 | ||
| + | # https://keras.io/ja/datasets/ を参照 | ||
| + | from keras.datasets import mnist | ||
| - | # データセットがダウンロード済みでなければ、ダウンロードも行う | + | (x_train, y_train), (x_test, y_test) = mnist.load_data() | 
| - | train, test = mnist.get_mnist(withlabel=True, ndim=1) | + | |
| </code> | </code> | ||
| - | Chainerが用意しているchainer.datasetsから、手書き数字MNISTのデータをダウンロードして読み込みます。 | + | Kerasが用意しているkeras.datasetsから、手書き数字MNISTのデータをダウンロードして読み込みます。 | 
| MNISTとは何か、またこれから何をやろうとしているのかについては、以下のサイトが非常に分かりやすいです。\\ | MNISTとは何か、またこれから何をやろうとしているのかについては、以下のサイトが非常に分かりやすいです。\\ | ||
| http://exceldeeplearning.blog.jp/archives/1411297.html\\ | http://exceldeeplearning.blog.jp/archives/1411297.html\\ | ||
| - | ちなみに、よく言われているMNISTの元データのダウンロードついては、[[http://twosquirrel.mints.ne.jp/?p=20277|こちら]]をご覧いただければと思います。 | + | ちなみに、よく言われているMNISTの元データのダウンロードついては、[[http://twosquirrel.mints.ne.jp/?p=20277|こちら]]をご覧いただければと思います。ただ、上記サイトのデータも、画像が既に数値の配列に変換されたものであるので、画像をダウンロードしたい場合は、サンプル数などは少し異なりますが、[[http://twosquirrel.mints.ne.jp/?p=20494|手書き数字MNISTのjpgファイル群をダウンロードする方法]]をご覧頂ければ幸いです。 | 
| 手書き数字MNISTは、本来は28x28pixelのグレースケールの画像と、それが何の数字であるかの正解ラベルのセットです。この画像と正解ラベルのセットが、training用の6万セット、test用の1万セットとなっています。 | 手書き数字MNISTは、本来は28x28pixelのグレースケールの画像と、それが何の数字であるかの正解ラベルのセットです。この画像と正解ラベルのセットが、training用の6万セット、test用の1万セットとなっています。 | ||
| - | ただ、画像のままではChainerでは読み込めません。そのため、画像を0~255の値をとる284個の数字が1列に並んだ配列(ndim=1)に変換(さらに正規化といって全部255で割る)したものと、正解ラベルのセット(withlabel=True)に変換したものを、chainer.datasets.get_mnist()関数で呼び出して、trainとtestという変数に代入しています。 | + | ただ、画像のままではKerasでは読み込めません。そのため、画像を0~255の値をとる784個の数字が1列に並んだ配列に変換(reshape(60000, 784))し、さらに正規化といって全部255で割ったたものをx_trainに代入しています。\\ | 
| + | さらに、以下のコードで、正解ラベルをone hot ベクトルに変換したものを、y_trainに代入しています。 | ||
| - | >なかがどんなカタチになっているかというと、一つの行(train[0])に | + | <code> | 
| - | >%%[[%%.234809284, .324039284, .34809382 …. .04843098%%]%%, 3%%]%% | + | # convert class vectors to binary class matrices | 
| - | >というように、左に入力値と右にその答え(ラベル値)がセットで入っています。 | + | y_train = keras.utils.to_categorical(y_train, 10) | 
| - | >また、chainerではtrainで学習して、testで試してみて正解率を見ていく感じになります。\\ | + | y_test = keras.utils.to_categorical(y_test, 10) | 
| - | 出典:[[https://qiita.com/tommyfms2/items/a2f23acbf515fba3495b|chainer 1.11.0以降のmnistを解説]] | + | </code> | 
| 具体的には、今回、 | 具体的には、今回、 | ||
| <code> | <code> | ||
| - | x, t = train[0] | ||
| print(x) | print(x) | ||
| print(t) | print(t) | ||
| </code> | </code> | ||
| と入力してShift + Enterで実行すると、以下のように表示されてます。 | と入力してShift + Enterで実行すると、以下のように表示されてます。 | ||
| - | {{:pasted:20171103-213151.png}} | ||
| - | {{:pasted:20171103-213221.png}} | + | {{:pasted:20171106-053503.png}} | 
| - | ちなみに、 | + | {{:pasted:20171106-053530.png}} | 
| - | <code> | + | |
| - | print(train[0]) | + | |
| - | </code> | + | |
| - | とすると、以下のように表示されて、train[0]は、1x784のNumpy配列(各要素は0から1までの数値(dtype=float32))と、正解ラベル(dtype=int32)のタプル(tuple)であることが分かります。 | + | |
| - | {{:pasted:20171103-213448.png}} | + | |
| - | {{:pasted:20171103-213512.png}} | + | {{:pasted:20171106-054412.png}} | 
| + | xは、1x784のNumpy配列(各要素は0から1までの数値(dtype=float32))であり、tは正解ラベル(dtype=int32)となっています。 | ||
| - | 次は、train[0]の画像データをJupyter Notebookで可視化しています。 | + | コードの解説に戻ります。\\ | 
| + | 次は、x_train[0]の画像データをJupyter Notebookで可視化しています。 | ||
| <code> | <code> | ||
| - | # matplotlibを使ったグラフ描画結果がnotebook内に表示されるようにします。 | + | # matplotlibを使ったグラフ描画結果がjupyter notebook内に表示されるようにする。 | 
| %matplotlib inline | %matplotlib inline | ||
| import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
| # データの例示 | # データの例示 | ||
| - | # trainデータセットの1行目を、画像データのNumpy配列(1x784)をx、正解ラベルをtとして取り出す | + | # x_trainデータセットの1行目、つまり、画像データのNumpy配列(1x784)をxとして取り出す | 
| - | x, t = train[0] | + | x = x_train[0] | 
| + | # y_trainの正解ラベル(one-hot表現のベクトル)の1行目を取り出し、numpyのargmax関数で数値として取り出す | ||
| + | # 今回は正解ラベルのインデックスが、そのまま、数字0や1のラベルとなっている。 | ||
| + | t = np.argmax(y_train[0]) | ||
| # 1x784のNumpy配列xを、28x28のNumpy配列に変換後、matplotlibのpyplotを用いて、 | # 1x784のNumpy配列xを、28x28のNumpy配列に変換後、matplotlibのpyplotを用いて、 | ||
| # グレースケール画像として読み込み、Jupyter Notebook内で表示 | # グレースケール画像として読み込み、Jupyter Notebook内で表示 | ||
| ライン 152: | ライン 168: | ||
| </code> | </code> | ||
| - | こちらは、ダウンロードしたMNIST画像の1つを、Jupyter Notebook上に表示して確認しています。一つ一つのコードについては、上記のコード内にコメントで記載しました。ここでは、numpyのreshape()関数と、matplotlib.pyplotのimshow()関数、show()関数を用いています。numpyとmatplotlibは機械学習プログラミングでよく使いますので、特にNumpyについては勉強しておく必要があります。 | + | こちらは、ダウンロードしたMNIST画像の1つを、Jupyter Notebook上に表示して確認しています。一つ一つのコードについては、上記のコード内にコメントで記載しました。ここでは、Numpyのreshape()関数と、matplotlib.pyplotのimshow()関数、show()関数を用いています。numpyとmatplotlibは機械学習プログラミングでよく使いますので、特にNumpyについては勉強しておく必要があります。 | 
| - | Numpyについては、[[http://twosquirrel.mints.ne.jp/?p=20153|Chainer用の画像処理メモ(5)初めてのNumPy"import numpy as np"]]をご覧いただければ幸いですが、以下の2つの本などで、ある程度しっかり勉強しておく必要があります。 | + | Numpyについては、[[http://twosquirrel.mints.ne.jp/?p=20153|Chainer用の画像処理メモ(5)初めてのNumPy"import numpy as np"]]をご覧いただければ幸いですが、pythonで機械学習を行うためには必須事項ですので、[[http://amzn.to/2zeJ7Lz|ゼロから作るDeep Learning]]などの本を読んで繰り返し写経して、ある程度しっかり勉強しておく必要があります。 | 
| - | <html> | + | 後半のコードは、特にMNISTのtrainingを行う際には不要ですが、データを読み込んだときに、読み込んだデータと元のデータとの整合性の検証は大事なことなので、このようなコードを記載しました。 | 
| - | <iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=twosquirrel-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=4873117585&linkId=560f10e512d4dcc99644bbfabcb18cd3"></iframe> | + | |
| - |   | + | |
| - | <iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=twosquirrel-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=4274221075&linkId=e362b0741ce31d467f246f2a47709906"></iframe> | + | |
| + | Kerasが用意しているMNISTデータセットを用いる手順は上記でおしまいです。 | ||
| - | </html> | ||
| + | 初めての場合は、次は、とりあえず、<wrap hi>[[(3)モデル設定(Keras)]]</wrap>に進んでください。 | ||
| + | |||
| + | ===== keras.datasets.mnist.load_data()関数について ===== | ||
| + | |||
| + | trainとtestに対応する2つのdatasetを返します。 | ||
| + | |||
| + | (1)グレースケール画像のデータをgetする場合\\ | ||
| + | 今回はそれにあたります(MNISTなんてグレースケールで十分)が、 | ||
| + | <code> | ||
| + | from keras.datasets import mnist | ||
| + | |||
| + | (x_train, y_train), (x_test, y_test) = mnist.load_data() | ||
| + | </code> | ||
| + | のように、x_trainとx_testに、画像データをNumpy配列に変換済みのものを代入し、y_trainとy_testに対応する正解ラベルを代入します。 | ||
| + | |||
| + | (2)もともとのデータセットがグレースケール画像のデータとなっています。 | ||
| + | |||
| + | Keras関連の関数については、公式マニュアルを読むのが一番です。日本語もあります!公式マニュアルが比較的読みやすいです。 | ||
| + | |||
| + | https://keras.io/ja/datasets/#mnist\\ | ||
| + | {{:pasted:20171106-052812.png}} | ||
| + | |||
| + | |||
| + | ===== one-hotエンコーディング について ===== | ||
| + | たとえば、正解ラベルが0,1,2, ..., 9 と10個あったときに、 | ||
| + | <code> | ||
| + | 0 => [1, 0, 0, 0, 0, 0, 0 ,0, 0, 0] | ||
| + | 1 => [0, 1, 0, 0, 0, 0, 0 ,0, 0, 0] | ||
| + | 2 => [0, 0, 1, 0, 0, 0, 0 ,0, 0, 0] | ||
| + | ... | ||
| + | 9 => [0, 0, 0, 0, 0, 0, 0 ,0, 0, 1] | ||
| + | </code> | ||
| + | のように、数値をベクトルで表現することを、one-hot エンコーディングといいます。 | ||
| - | 後半のコードは、特にMNISTのtrainingを行う際には不要ですが、データを読み込んだときに、読み込んだデータと元のデータとの整合性の検証は大事なことなので、このようなコードの記載があるのだと思われます。 | + | 機械学習の計算では、コンピュータに行列計算をさせることが多い(だからGPUをうまく使用すると計算スピードが速くなる)ので、正解ラベルもベクトルで表現しておくと都合がよいらしいです。コンピュータに効率良く計算させるために、ミニバッチ学習とか、プログラミング的には面倒なだけで意味不明なことをやっていたりするという噂を聞いたりしたことがあります(まだちゃんと理解していません、間違っていたらすみません、、、)。 | 
| - | Chainerが用意しているMNISTデータセットを用いる手順は上記でおしまいです。 | + | ちなみに、one-hotベクトルを、通常のラベルに戻すときには、Numpyのargmax()関数を利用して、one-hotベクトル(=配列)の、最大要素のインデックスを取り出して、数値に戻します。具体的な方法は、[[Keras2用自前データの準備]]に記載予定です。 | 
| - | <wrap hi> | ||
| - | 初めての場合は、次は、とりあえず、</wrap>[[(3)モデルの記述]]<wrap hi>に進んでください。 | ||
| - | </wrap> | ||
| + | 2016-11-08 Kerasによる多クラス分類(Iris) | ||
| + | http://aidiary.hatenablog.com/entry/20161108/1478609028 | ||
| ===== 参考文献 ===== | ===== 参考文献 ===== | ||
| 初めてKerasプログラミングをやるときの超おすすめ本。\\ | 初めてKerasプログラミングをやるときの超おすすめ本。\\ | ||