この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
4_モデル学習_keras [2017/11/09] adash333 [開発環境] |
4_モデル学習_keras [2018/10/07] (現在) |
||
---|---|---|---|
ライン 14: | ライン 14: | ||
<code> | <code> | ||
#4 モデル学習(Keras) | #4 モデル学習(Keras) | ||
- | history = model.fit(X_train, y_train, | + | history = model.fit(x_train, y_train, |
batch_size=batch_size, epochs=epochs, | batch_size=batch_size, epochs=epochs, | ||
- | verbose=1, validation_data=(X_test, y_test)) | + | verbose=1, validation_data=(x_test, y_test)) |
</code> | </code> | ||
- | 作成中 | ||
===== 開発環境 ===== | ===== 開発環境 ===== | ||
ライン 36: | ライン 35: | ||
==== 0. 前回終了時の画面 ==== | ==== 0. 前回終了時の画面 ==== | ||
- | [[(2)データ準備(Keras)]]終了時の、以下のような状態から始めます。 | + | [[(3)モデル設定(Keras)]]終了時の、以下のような状態から始めます。 |
- | {{:pasted:20171106-051215.png}} | + | {{:pasted:20171106-063759.png}} |
- | ==== 1. モデルの設定 ==== | + | ==== 1. モデルの学習 ==== |
以下のコードを入力して、Shift + Enterを押します。 | 以下のコードを入力して、Shift + Enterを押します。 | ||
<code> | <code> | ||
- | #3 モデル設定(Keras) | + | #4 モデル学習(Keras) |
- | batch_size = 128 | + | history = model.fit(x_train, y_train, |
- | # num_classes = 10 | + | batch_size=batch_size, epochs=epochs, |
- | # epochs = 20 | + | verbose=1, validation_data=(x_test, y_test)) |
- | epochs = 3 | + | |
- | + | ||
- | # モデルの記述 | + | |
- | model = Sequential() | + | |
- | model.add(Dense(512, activation='relu', input_shape=(784,))) | + | |
- | model.add(Dropout(0.2)) | + | |
- | model.add(Dense(512, activation='relu')) | + | |
- | model.add(Dropout(0.2)) | + | |
- | model.add(Dense(10, activation='softmax')) | + | |
- | + | ||
- | model.summary() | + | |
- | + | ||
- | # 損失関数などを設定 | + | |
- | model.compile(loss='categorical_crossentropy', | + | |
- | optimizer=RMSprop(), | + | |
- | metrics=['accuracy']) | + | |
</code> | </code> | ||
以下のような画面になります。 | 以下のような画面になります。 | ||
- | {{:pasted:20171106-063744.png}} | + | {{:pasted:20171109-223753.png}} |
- | {{:pasted:20171106-063759.png}} | + | 3分くらい待つと、学習が終了します。 |
- | 順に解説していきます。 | + | {{:pasted:20171110-032455.png}} |
- | <code> | ||
- | #3 モデル設定(Keras) | ||
- | batch_size = 128 | ||
- | # num_classes = 10 | ||
- | # epochs = 20 | ||
- | epochs = 3 | ||
- | </code> | ||
- | batch_size, epochsなどの数値を設定します。epochsは、学習を繰り返す回数であり、回数が少なすぎても、多すぎても微妙と言われています(参考:過学習、early stopping)。今回のコードの場合、適切なepoch数についてはわかりませんが、学習にかかる時間について記載します。ノートパソコンだと、1 epochあたり32秒くらいかかるので、今回のチュートリアルでは、epoch数をかなり少ない3回としました。GPUを積んだデスクトップパソコンだと、1 epochあたり2秒とかなので、epoch数は20回に設定すればよいと思います。 | + | model.fit()関数により、モデルの学習を実行しています。 |
- | batch_sizeについては、まだよく分かっていないので、今後、勉強して内容が理解できたら、こちらに追加記載させていただきたいと思います。 | + | 引数については、KerasのDocumentationそのままとなりますが、以下に記載します。 |
- | <code> | + | ---- |
- | # モデルの記述 | + | |
- | model = Sequential() | + | |
- | model.add(Dense(512, activation='relu', input_shape=(784,))) | + | |
- | model.add(Dropout(0.2)) | + | |
- | model.add(Dense(512, activation='relu')) | + | |
- | model.add(Dropout(0.2)) | + | |
- | model.add(Dense(10, activation='softmax')) | + | |
- | </code> | + | |
- | "model = Sequential()"というおまじないの文章の後、モデルを1個ずつ順番に記述していきます。 | + | x: 入力データ,Numpy 配列,あるいは Numpy 配列のリスト (モデルに複数の入力がある場合)\\ |
+ | y: ラベル,Numpy 配列. | ||
- | 今回は、4層のMLP(multiple layer perceptron)のモデルを設定しています。 | + | batch_size: 整数.設定したサンプル数ごとに勾配の更新を行います。今回は、<wrap hi>[[(3)モデル設定(Keras)]]</wrap>のところで、batch_size = 128と設定していましたので、128が用いられています。 |
- | <code> | + | |
- | model.add(Dense(512, activation='relu', input_shape=(784,))) | + | |
- | model.add(Dropout(0.2)) | + | |
- | </code> | + | |
- | 1層目の入力層は28x28=784個のunit(ノード)で、2層目の中間層は512個のunit(ノード)に設定しています。\\ | + | |
- | 2層目の活性化関数はrelu関数を用いており、\\ | + | |
- | その後、ドロップアウトといって、過学習を防ぐために、512個のunit(ノード)のうち、20%のunit(ノード)を無効化します。 | + | |
- | この話、初めての方には本当に訳わからん状態だとは思いますが、機械学習の理論のところなので、あとで、以下の本を読んで理解するのがお勧めです。 | + | epochs: 整数で,モデルを訓練するエポック数。今回は、<wrap hi>[[(3)モデル設定(Keras)]]</wrap>のところで、epochs = 3と設定していましたので、3回学習が行われています。 |
- | <html> | + | verbose: 0とすると標準出力にログを出力しません. 1の場合はログをプログレスバーで標準出力,2 の場合はエポックごとに1行のログを出力します |
- | <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=6a99e4e49da751388b138a1c4747e16b"></iframe> | + | |
- | </html> | + | |
- | (参考)\\ | + | validation_data=(x_test, y_test): ホールドアウト検証用データとして使うデータのタプル (x_val, y_val) か (x_val, y_val, val_sample_weights)。設定すると validation_split を無視します。 |
- | 2016-07-18 | + | |
- | 【Deep Learning】過学習とDropoutについて\\ | + | |
- | http://sonickun.hatenablog.com/entry/2016/07/18/191656 | + | |
- | コードの解説に戻ります。 | + | ---- |
- | <code> | ||
- | model.add(Dense(512, activation='relu')) | ||
- | model.add(Dropout(0.2)) | ||
- | </code> | ||
- | 上記と同様、3層目の中間層を512個のunit(ノード)に設定していて、\\ | ||
- | 3層目の活性化関数はrelu関数を用いており、\\ | ||
- | 過学習を防ぐために、512個のunit(ノード)のうち、20%のunit(ノード)を無効化します。 | ||
- | <code> | + | KerasでのModel学習の手順は上記でおしまいです。 |
- | model.add(Dense(10, activation='softmax')) | + | |
- | </code> | + | |
- | 4層目は出力層であり、0から9までの10個に分類するので、4層目は10個のunit(ノード)となります。\\ | + | |
- | 分類問題なので、出力層では活性化関数をsoftmax関数を用いることになります。\\ | + | |
- | 蛇足ですが、回帰分析を行いたい場合は、分類問題の最後のsoftmax関数を恒等関数に変更し、損失関数 (loss function) として2乗和誤差 (mean squared error) を設定すればよいと思われます。 | + | |
- | 入力層と出力層のunit(ノード)数は、常に一定ですが、中間層の層の数を深くしたり(Deep Learning)、中間層のunit(ノード)数を変更したり、畳み込み(Convolution)やMax Poolingを行ったり、損失関数の設定値を変更したりしてモデルをいじることにより、より高い正解率をたたき出すことが求められており、例えば、https://www.kaggle.com/というサイトでは皆が「このモデルで正解率xx%をたたき出しましたよ!」と競っています。 | + | 初めての方は、次は、<wrap hi>[[(5)結果の出力(Keras)]]</wrap>に進んでください。 |
- | <code> | ||
- | model.summary() | ||
- | </code> | ||
- | modelをテキストで表示してくれます | ||
- | <code> | + | (参考) |
- | # 損失関数などを設定 | + | Keras チュートリアル\\ |
- | model.compile(loss='categorical_crossentropy', | + | sasayabaku |
- | optimizer=RMSprop(), | + | 2017年08月16日に更新\\ |
- | metrics=['accuracy']) | + | https://qiita.com/sasayabaku/items/64a01363bcd5c44feb0b |
- | </code> | + | |
- | 損失関数にcategorical_crossentropy関数を用いています。\\ | + | |
- | categorical_crossentropy:この目的関数を使うには,ラベルがバイナリ配列であり,その形状が(nb_samples, nb_classes)であることが必要だそうです(???)\\ | + | |
- | 今回は、最適化関数(optimizer)に、RMSprop()を用いています。\\ | ||
- | metricsについてはよくわかりません。。。(爆) | ||
- | KerasでのModel設定の手順は上記でおしまいです。 | + | ===== kerasのSequentialモデルのfitメソッドについて ===== |
- | <wrap hi> | + | https://keras.io/ja/models/sequential/\\ |
- | 初めての場合は、次は、とりあえず、</wrap>[[(4)モデル学習(Keras)]]<wrap hi>に進んでください。 | + | {{:pasted:20171110-035359.png}} |
- | </wrap> | + | |
- | ===== kerasで損失関数(=目的関数)の利用方法 ===== | + | fit()関数は、固定のエポック数でモデルを訓練します。 |
- | 作成中 | + | 戻り値は、History オブジェクト。History.history 属性は、実行に成功したエポックにおける訓練の損失値と評価関数値の記録と,(適用可能ならば)検証における損失値と評価関数値も記録しています。 |
- | (参考) | + | model.fit()の返り値を出力を変数に格納すると学習過程のパラメータの推移をプロットできます。 |
- | 損失関数の利用方法について\\ | + | |
- | https://keras.io/ja/losses/\\ | + | |
- | https://keras.io/ja/objectives/ | + | |
+ | 上記の例では、Historyに格納しているので、以下のようなコードで、lossやaccuracyのグラフを出力することができます。 | ||
- | 機械学習における誤差関数、損失関数、etcについて\\ | + | <code> |
- | http://otasuke.goo-net.com/qa8944219.html | + | import matplotlib.pyplot as plt |
+ | %matplotlib inline | ||
+ | loss = history.history['loss'] | ||
+ | val_loss = history.history['val_loss'] | ||
- | ===== Optimizerについて ===== | + | # lossのグラフ |
- | optimizer(最適化)について\\ | + | plt.plot(range(3), loss, marker='.', label='loss') |
- | https://keras.io/ja/optimizers/ | + | plt.plot(range(3), val_loss, marker='.', label='val_loss') |
- | ===== 参考文献 ===== | + | plt.legend(loc='best', fontsize=10) |
- | 初めてKerasプログラミングをやるときの超おすすめ本。\\ | + | plt.grid() |
+ | plt.xlabel('epoch') | ||
+ | plt.ylabel('loss') | ||
+ | plt.show() | ||
+ | </code> | ||
- | <html> | + | {{:pasted:20171110-040150.png}} |
- | <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=13a7db2c19cc5f40d6ab48906de8abd1"></iframe> | + | <code> |
+ | import matplotlib.pyplot as plt | ||
+ | %matplotlib inline | ||
+ | acc = history.history['acc'] | ||
+ | val_acc = history.history['val_acc'] | ||
- | | + | # accuracyのグラフ |
+ | plt.plot(range(3), acc, marker='.', label='acc') | ||
+ | plt.plot(range(3), val_acc, marker='.', label='val_acc') | ||
+ | plt.legend(loc='best', fontsize=10) | ||
+ | plt.grid() | ||
+ | plt.xlabel('epoch') | ||
+ | plt.ylabel('acc') | ||
+ | plt.show() | ||
+ | </code> | ||
- | <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=4839962510&linkId=d722909965b5eab4196d370757843f6f"></iframe> | + | {{:pasted:20171110-040318.png}} |
- | </html> | + | |
- | ===== リンク ===== | ||
- | 次 [[(4)モデル学習(Keras)]] | ||
- | |||
- | 前 [[(2)データ準備(Keras)]] | ||
- | |||
- | |||
- | <wrap hi>Keras2でMNIST目次</wrap>\\ | ||
- | [[Kerasプログラミングの全体図]] | ||
- | -[[(1)Kerasを使用するためのimport文]] | ||
- | -[[(2)データ準備(Keras)]] | ||
- | -[[(3)モデル設定(Keras)]] | ||
- | -[[(4)モデル学習(Keras)]] | ||
- | -[[(5)結果の出力(Keras)]] | ||
- | -[[(6)学習結果の保存(Keras)]] | ||
- | -[[(7)推測(Keras)]] | ||
+ | ===== Optimizerについて ===== | ||
+ | optimizer(最適化)について\\ | ||
+ | https://keras.io/ja/optimizers/ | ||
===== 参考文献 ===== | ===== 参考文献 ===== |