この文書の現在のバージョンと選択したバージョンの差分を表示します。
次のリビジョン | 前のリビジョン | ||
3_モデル設定_keras [2017/10/27] adash333 作成 |
3_モデル設定_keras [2018/10/07] (現在) |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
===== (3)モデルの設定(Keras) ===== | ===== (3)モデルの設定(Keras) ===== | ||
- | <KerasでMNIST目次>\\ | + | <wrap hi>Keras2でMNIST目次</wrap>\\ |
- | [[Kerasプログラミングの全体図]]\\ | + | [[Kerasプログラミングの全体図]] |
- | [[(1)Kerasを使用するためのimport文]]\\ | + | -[[(1)Kerasを使用するためのimport文]] |
- | [[(2)データ準備(Keras)]]\\ | + | -[[(2)データ準備(Keras)]] |
- | [[(3)モデル設定(Keras)]]\\ | + | -[[(3)モデル設定(Keras)]] <wrap hi><= いまココ</wrap> |
- | [[(4)モデル学習(Keras)]]\\ | + | -[[(4)モデル学習(Keras)]] |
- | [[(5)結果の出力(Keras)]]\\ | + | -[[(5)結果の出力(Keras)]] |
- | [[(6)学習結果の保存(Keras)]]\\ | + | -[[(6)学習結果の保存(Keras)]] |
- | [[(7)推測(Keras)]]\\ | + | -[[(7)推測(Keras)]] |
- | 最初に以下をコピペするだけですが、プログラムごとに、さらにimport文の追加が必要になる場合があります。 | + | model = Sequential()からスタートして、順番にモデルを記述していきます。 |
<code> | <code> | ||
- | import keras | + | #3 モデルの記述(Keras) |
- | from keras.models import Sequential | + | batch_size = 128 |
- | from keras.layers import Dense, Dropout | + | num_classes = 10 |
- | from keras.optimizers import RMSprop | + | # epochs = 20 |
- | from keras.utils import np_utils | + | epochs = 3 |
- | from sklearn.model_selection import train_test_split | + | model = Sequential() |
+ | # model.addでモデルを記述していく | ||
- | import numpy as np | + | model.summary() |
- | from PIL import Image | + | |
- | import os | + | model.compile(loss='categorical_crossentropy', |
+ | optimizer=RMSprop(), | ||
+ | metrics=['accuracy']) | ||
</code> | </code> | ||
- | 始めはかなりとっつきにくいimport文ですが、pythonの勉強をしていくにつれて、徐々に、慣れてきます。 | + | モデルの記述は、見たままな感じで、個人的にはKerasのこのモデルの記述方法が分かりやすくて好みです。 |
- | keras特有のもの以外のimport文については、以下のリンクをご覧ください。 | ||
- | 機械学習で用いるpythonの”import xxx”まとめ\\ | + | ===== 開発環境 ===== |
- | 2017/10/25\\ | + | Windows 8.1\\ |
- | http://twosquirrel.mints.ne.jp/?p=20344 | + | Anaconda \\ |
+ | Python 3.5\\ | ||
+ | Tensorflow 1.4\\ | ||
+ | Keras 2.0.9\\ | ||
+ | Keras2.0のインストール方法は[[windowsにkeras2.0をインストール]]をご覧下さい。 | ||
+ | このページは、[[(2)データ準備(Keras)]]の続きであり、今回は、モデルの設定を行っていきます。 | ||
+ | |||
+ | ===== 手順 ===== | ||
+ | |||
+ | |||
+ | ==== 0. 前回終了時の画面 ==== | ||
+ | [[(2)データ準備(Keras)]]終了時の、以下のような状態から始めます。 | ||
+ | |||
+ | {{:pasted:20171106-051215.png}} | ||
+ | ==== 1. モデルの設定 ==== | ||
+ | 以下のコードを入力して、Shift + Enterを押します。 | ||
+ | |||
+ | <code> | ||
+ | #3 モデル設定(Keras) | ||
+ | batch_size = 128 | ||
+ | # num_classes = 10 | ||
+ | # epochs = 20 | ||
+ | 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> | ||
+ | |||
+ | 以下のような画面になります。 | ||
+ | |||
+ | {{:pasted:20171106-063744.png}} | ||
+ | |||
+ | {{:pasted:20171106-063759.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回に設定すればよいと思います。 | ||
+ | |||
+ | batch_sizeについては、まだよく分かっていないので、今後、勉強して内容が理解できたら、こちらに追加記載させていただきたいと思います。 | ||
+ | |||
+ | <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個ずつ順番に記述していきます。 | ||
+ | |||
+ | 今回は、4層のMLP(multiple layer perceptron)のモデルを設定しています。 | ||
+ | <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(ノード)を無効化します。 | ||
+ | |||
+ | この話、初めての方には本当に訳わからん状態だとは思いますが、機械学習の理論のところなので、あとで、以下の本を読んで理解するのがお勧めです。 | ||
+ | |||
+ | <html> | ||
+ | <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> | ||
+ | |||
+ | (参考)\\ | ||
+ | 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> | ||
+ | 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%をたたき出しましたよ!」と競っています。 | ||
+ | |||
+ | <code> | ||
+ | model.summary() | ||
+ | </code> | ||
+ | modelをテキストで表示してくれます | ||
+ | |||
+ | <code> | ||
+ | # 損失関数などを設定 | ||
+ | model.compile(loss='categorical_crossentropy', | ||
+ | optimizer=RMSprop(), | ||
+ | metrics=['accuracy']) | ||
+ | </code> | ||
+ | 損失関数にcategorical_crossentropy関数を用いています。\\ | ||
+ | categorical_crossentropy:この目的関数を使うには,ラベルがバイナリ配列であり,その形状が(nb_samples, nb_classes)であることが必要だそうです(???)\\ | ||
+ | |||
+ | 今回は、最適化関数(optimizer)に、RMSprop()を用いています。\\ | ||
+ | metricsについてはよくわかりません。。。(爆) | ||
+ | |||
+ | KerasでのModel設定の手順は上記でおしまいです。 | ||
+ | |||
+ | 初めての場合は、次は、とりあえず、<wrap hi>[[(4)モデル学習(Keras)]]</wrap>に進んでください。 | ||
+ | |||
+ | |||
+ | ===== kerasで損失関数(=目的関数)の利用方法 ===== | ||
+ | |||
+ | 作成中 | ||
+ | |||
+ | (参考) | ||
+ | 損失関数の利用方法について\\ | ||
+ | https://keras.io/ja/losses/\\ | ||
+ | https://keras.io/ja/objectives/ | ||
+ | |||
+ | |||
+ | 機械学習における誤差関数、損失関数、etcについて\\ | ||
+ | http://otasuke.goo-net.com/qa8944219.html | ||
+ | |||
+ | ===== Optimizerについて ===== | ||
+ | optimizer(最適化)について\\ | ||
+ | https://keras.io/ja/optimizers/ | ||
===== 参考文献 ===== | ===== 参考文献 ===== | ||
初めてKerasプログラミングをやるときの超おすすめ本。\\ | 初めてKerasプログラミングをやるときの超おすすめ本。\\ | ||
ライン 49: | ライン 199: | ||
===== リンク ===== | ===== リンク ===== | ||
- | 目次\\ | + | 次 [[(4)モデル学習(Keras)]] |
- | [[Kerasプログラミングの全体図]]\\ | + | |
- | [[(1)Kerasを使用するためのimport文]]\\ | + | 前 [[(2)データ準備(Keras)]] |
- | [[(2)データ準備(Keras)]]\\ | + | |
- | [[(3)モデル設定(Keras)]]\\ | + | |
- | [[(4)モデル学習(Keras)]]\\ | + | <wrap hi>Keras2でMNIST目次</wrap>\\ |
- | [[(5)結果の出力(Keras)]]\\ | + | [[Kerasプログラミングの全体図]] |
- | [[(6)学習結果の保存(Keras)]]\\ | + | -[[(1)Kerasを使用するためのimport文]] |
- | [[(7)推測(Keras)]]\\ | + | -[[(2)データ準備(Keras)]] |
+ | -[[(3)モデル設定(Keras)]] | ||
+ | -[[(4)モデル学習(Keras)]] | ||
+ | -[[(5)結果の出力(Keras)]] | ||
+ | -[[(6)学習結果の保存(Keras)]] | ||
+ | -[[(7)推測(Keras)]] | ||