3_モデル設定_keras
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
3_モデル設定_keras [2017/11/05] – [(3)モデルの設定(Keras)] adash333 | 3_モデル設定_keras [2018/10/07] (現在) – 外部編集 127.0.0.1 | ||
---|---|---|---|
行 41: | 行 41: | ||
Keras2.0のインストール方法は[[windowsにkeras2.0をインストール]]をご覧下さい。 | Keras2.0のインストール方法は[[windowsにkeras2.0をインストール]]をご覧下さい。 | ||
- | このページは、[[(1)Kerasを使用するためのimport文]]の続きであり、今回は、MNISTのデータの準備・設定を行っていきます。 | + | このページは、[[(2)データ準備(Keras)]]の続きであり、今回は、モデルの設定を行っていきます。 |
- | データの準備が難しいところなのですが、今回は、最初なので、Kerasであらかじめ用意されているMNISTデータセットを利用します。 | ||
- | |||
- | オリジナルデータセットの準備については、後日、[[Keras2用自前データの準備]]に記載予定です。 | ||
===== 手順 ===== | ===== 手順 ===== | ||
==== 0. 前回終了時の画面 ==== | ==== 0. 前回終了時の画面 ==== | ||
- | [[(1)Kerasを使用するためのimport文]]終了時の、以下のような状態から始めます。 | + | [[(2)データ準備(Keras)]]終了時の、以下のような状態から始めます。 |
- | {{: | + | {{: |
- | ==== 1. データセットの準備 | + | ==== 1. モデルの設定 |
- | 以下のコードを入力して、Shift + Enterを押します。最初は、MNISTの画像データなどがダウンロードされるので、時間がかかります。 | + | 以下のコードを入力して、Shift + Enterを押します。 |
< | < | ||
- | #2 データ準備(Keras)(MNISTの場合) | + | #3 モデル設定(Keras) |
- | # Kerasが用意しているMNISTデータセットをダウンロードしてx_train, | + | batch_size = 128 |
- | # https:// | + | # num_classes = 10 |
- | from keras.datasets import mnist | + | # epochs = 20 |
+ | epochs = 3 | ||
- | (x_train, y_train), (x_test, y_test) | + | # モデルの記述 |
- | x_train = x_train.reshape(60000, 784) | + | model = Sequential() |
- | x_test = x_test.reshape(10000, 784) | + | model.add(Dense(512, activation=' |
- | x_train = x_train.astype(' | + | model.add(Dropout(0.2)) |
- | x_test = x_test.astype('float32') | + | model.add(Dense(512, activation=' |
- | x_train /= 255 | + | model.add(Dropout(0.2)) |
- | x_test /= 255 | + | model.add(Dense(10, activation='softmax')) |
- | # convert class vectors to binary class matrices | + | model.summary() |
- | y_train = keras.utils.to_categorical(y_train, | + | |
- | y_test = keras.utils.to_categorical(y_test, 10) | + | |
- | # matplotlibを使ったグラフ描画結果がnotebook内に表示されるようにします。 | + | # 損失関数などを設定 |
- | %matplotlib inline | + | model.compile(loss='categorical_crossentropy', |
- | import matplotlib.pyplot as plt | + | |
- | + | | |
- | # データの例示 | + | |
- | x = x_train[0] | + | |
- | t = np.argmax(y_train[0]) | + | |
- | plt.imshow(x.reshape(28, | + | |
- | plt.show() | + | |
- | print('label:', t) | + | |
</ | </ | ||
- | 以下のような画面になります。(以下の画面は、2回目以降の画面となります。最初は、「Downloading from %%http:// | + | 以下のような画面になります。 |
- | {{: | + | {{: |
- | {{: | + | {{: |
順に解説していきます。 | 順に解説していきます。 | ||
< | < | ||
- | #2 データ準備(Keras)(MNISTの場合) | + | #3 モデル設定(Keras) |
- | # Kerasが用意しているMNISTデータセットをダウンロードしてx_train, | + | batch_size = 128 |
- | # https:// | + | # num_classes = 10 |
- | from keras.datasets import mnist | + | # epochs = 20 |
- | + | epochs | |
- | (x_train, y_train), (x_test, y_test) | + | |
</ | </ | ||
- | Kerasが用意しているkeras.datasetsから、手書き数字MNISTのデータをダウンロードして読み込みます。 | + | batch_size, epochsなどの数値を設定します。epochsは、学習を繰り返す回数であり、回数が少なすぎても、多すぎても微妙と言われています(参考: |
- | MNISTとは何か、またこれから何をやろうとしているのかについては、以下のサイトが非常に分かりやすいです。\\ | + | batch_sizeについては、まだよく分かっていないので、今後、勉強して内容が理解できたら、こちらに追加記載させていただきたいと思います。 |
- | http:// | + | |
- | ちなみに、よく言われているMNISTの元データのダウンロードついては、[[http:// | + | |
- | + | ||
- | 手書き数字MNISTは、本来は28x28pixelのグレースケールの画像と、それが何の数字であるかの正解ラベルのセットです。この画像と正解ラベルのセットが、training用の6万セット、test用の1万セットとなっています。 | + | |
- | + | ||
- | ただ、画像のままではKerasでは読み込めません。そのため、画像を0~255の値をとる284個の数字が1列に並んだ配列に変換(reshape(60000, | + | |
- | さらに、以下のコードで、正解ラベルをone hot ベクトルに変換したものを、y_trainに代入しています。 | + | |
< | < | ||
- | # convert class vectors to binary class matrices | + | # モデルの記述 |
- | y_train | + | model = Sequential() |
- | y_test = keras.utils.to_categorical(y_test, 10) | + | model.add(Dense(512, activation=' |
+ | model.add(Dropout(0.2)) | ||
+ | model.add(Dense(512, activation=' | ||
+ | model.add(Dropout(0.2)) | ||
+ | model.add(Dense(10, activation=' | ||
</ | </ | ||
- | 具体的には、今回、 | + | "model = Sequential()" |
+ | |||
+ | 今回は、4層のMLP(multiple layer perceptron)のモデルを設定しています。 | ||
< | < | ||
- | print(x) | + | model.add(Dense(512, activation=' |
- | print(t) | + | model.add(Dropout(0.2)) |
</ | </ | ||
- | と入力してShift + Enterで実行すると、以下のように表示されてます。 | + | 1層目の入力層は28x28=784個のunit(ノード)で、2層目の中間層は512個のunit(ノード)に設定しています。\\ |
+ | 2層目の活性化関数はrelu関数を用いており、\\ | ||
+ | その後、ドロップアウトといって、過学習を防ぐために、512個のunit(ノード)のうち、20%のunit(ノード)を無効化します。 | ||
- | {{: | + | この話、初めての方には本当に訳わからん状態だとは思いますが、機械学習の理論のところなので、あとで、以下の本を読んで理解するのがお勧めです。 |
- | {{:pasted:20171106-053530.png}} | + | < |
+ | <iframe style=" | ||
+ | </ | ||
- | {{: | + | (参考)\\ |
+ | 2016-07-18 | ||
+ | 【Deep Learning】過学習とDropoutについて\\ | ||
+ | http:// | ||
- | xは、1x784のNumpy配列(各要素は0から1までの数値(dtype=float32))であり、tは正解ラベル(dtype=int32)となっています。 | + | コードの解説に戻ります。 |
- | コードの解説に戻ります。\\ | + | < |
- | 次は、x_train[0]の画像データをJupyter Notebookで可視化しています。 | + | model.add(Dense(512, |
+ | model.add(Dropout(0.2)) | ||
+ | </ | ||
+ | 上記と同様、3層目の中間層を512個のunit(ノード)に設定していて、\\ | ||
+ | 3層目の活性化関数はrelu関数を用いており、\\ | ||
+ | 過学習を防ぐために、512個のunit(ノード)のうち、20%のunit(ノード)を無効化します。 | ||
< | < | ||
- | # matplotlibを使ったグラフ描画結果がjupyter notebook内に表示されるようにする。 | + | model.add(Dense(10, |
- | %matplotlib inline | + | </ |
- | import matplotlib.pyplot as plt | + | 4層目は出力層であり、0から9までの10個に分類するので、4層目は10個のunit(ノード)となります。\\ |
+ | 分類問題なので、出力層では活性化関数をsoftmax関数を用いることになります。\\ | ||
+ | 蛇足ですが、回帰分析を行いたい場合は、分類問題の最後のsoftmax関数を恒等関数に変更し、損失関数 (loss function) として2乗和誤差 (mean squared error) を設定すればよいと思われます。 | ||
- | # データの例示 | + | 入力層と出力層のunit(ノード)数は、常に一定ですが、中間層の層の数を深くしたり(Deep Learning)、中間層のunit(ノード)数を変更したり、畳み込み(Convolution)やMax Poolingを行ったり、損失関数の設定値を変更したりしてモデルをいじることにより、より高い正解率をたたき出すことが求められており、例えば、https:// |
- | # x_trainデータセットの1行目、つまり、画像データのNumpy配列(1x784)をxとして取り出す | + | |
- | x = x_train[0] | + | < |
- | # y_trainの正解ラベル(one-hot表現のベクトル)の1行目を取り出し、numpyのargmax関数で数値として取り出す | + | model.summary() |
- | # 今回は正解ラベルのインデックスが、そのまま、数字0や1のラベルとなっている。 | + | |
- | t = np.argmax(y_train[0]) | + | |
- | # 1x784のNumpy配列xを、28x28のNumpy配列に変換後、matplotlibのpyplotを用いて、 | + | |
- | # グレースケール画像として読み込み、Jupyter Notebook内で表示 | + | |
- | plt.imshow(x.reshape(28, | + | |
- | plt.show() | + | |
- | # 正解ラベルの表示 | + | |
- | print(' | + | |
</ | </ | ||
+ | modelをテキストで表示してくれます | ||
- | こちらは、ダウンロードしたMNIST画像の1つを、Jupyter Notebook上に表示して確認しています。一つ一つのコードについては、上記のコード内にコメントで記載しました。ここでは、Numpyのreshape()関数と、matplotlib.pyplotのimshow()関数、show()関数を用いています。numpyとmatplotlibは機械学習プログラミングでよく使いますので、特にNumpyについては勉強しておく必要があります。 | + | < |
+ | # 損失関数などを設定 | ||
+ | model.compile(loss=' | ||
+ | optimizer=RMSprop(), | ||
+ | metrics=[' | ||
+ | </ | ||
+ | 損失関数にcategorical_crossentropy関数を用いています。\\ | ||
+ | categorical_crossentropy: | ||
- | Numpyについては、[[http:// | + | 今回は、最適化関数(optimizer)に、RMSprop()を用いています。\\ |
+ | metricsについてはよくわかりません。。。(爆) | ||
- | 後半のコードは、特にMNISTのtrainingを行う際には不要ですが、データを読み込んだときに、読み込んだデータと元のデータとの整合性の検証は大事なことなので、このようなコードを記載しました。 | + | KerasでのModel設定の手順は上記でおしまいです。 |
- | Kerasが用意しているMNISTデータセットを用いる手順は上記でおしまいです。 | + | 初めての場合は、次は、とりあえず、< |
- | <wrap hi> | ||
- | 初めての場合は、次は、とりあえず、</ | ||
- | </ | ||
- | ===== keras.datasets.mnist.load_data()関数について | + | ===== kerasで損失関数(=目的関数)の利用方法 |
作成中 | 作成中 | ||
+ | |||
+ | (参考) | ||
+ | 損失関数の利用方法について\\ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | |||
+ | 機械学習における誤差関数、損失関数、etcについて\\ | ||
+ | http:// | ||
+ | |||
+ | ===== Optimizerについて ===== | ||
+ | optimizer(最適化)について\\ | ||
+ | https:// | ||
===== 参考文献 ===== | ===== 参考文献 ===== | ||
初めてKerasプログラミングをやるときの超おすすめ本。\\ | 初めてKerasプログラミングをやるときの超おすすめ本。\\ |
3_モデル設定_keras.1509917150.txt.gz · 最終更新: 2018/10/07 (外部編集)