- はじめに
- ソースコード
- ソースコード解説
- 学習したモデルを読み込む
はじめに
TensorFlowの動作実験をする。Pythonを使うのは初めてなので書き方が変なところがあるかもしれない。TensorFlow(Keras)の実験が主なので、ニューラルネットワークが何なのかわからない人はほかのページや文献を当たって欲しい。
実験内容は以下の通り。
- 3層ニューラルネットワーク(ディープラーニングではない)
- 学習対象はXOR
ソースコード
できあがったソースコードは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
import numpy import keras if __name__ == '__main__': model = keras.models.Sequential() model.add( keras.layers.Dense( 2, activation='sigmoid' ) ) model.add( keras.layers.Dense( 1, activation='sigmoid' ) ) optimizer = keras.optimizers.SGD( 0.2 ) loss = keras.losses.BinaryCrossentropy() model.compile( optimizer, loss ) x = numpy.array( [ [ 0, 0 ], [ 0, 1 ], [ 1, 0 ], [ 1, 1 ] ] ) y = numpy.array( [ [0], [1], [1], [0] ] ) es = keras.callbacks.EarlyStopping( monitor='loss', min_delta=0.00001, patience=5, mode='min') model.fit( x, y, epochs=30000, verbose=2, callbacks=[es]) model.save( 'z:\\tensorflowtest') print( model.predict( numpy.array( [ [ 0, 0 ] ] ) ) ) print( model.predict( numpy.array( [ [ 0, 1 ] ] ) ) ) print( model.predict( numpy.array( [ [ 1, 0 ] ] ) ) ) print( model.predict( numpy.array( [ [ 1, 1 ] ] ) ) ) |
ソースコード解説
5-7行目
3層ニューラルネットワークモデルの定義。
入力層の定義が無く、中間層と出力層の2つだけ定義してある。なぜ入力層の定義が存在しないかはまだわかっていない。
層(レイヤー)の定義がDenseだと全結合になる。Denseの第1引数は次数、引数activationには活性化関数を指定する。中間層は入力層の次数と同じ、出力層の次数はXORの場合は1次となる。活性化関数はシグモイド関数を利用。
9-11行目
optimizerで最適化関数を定義する。SGDというのは確率的勾配降下法(Stochastic Gradient Descent)を意味する。大学生のときは最急降下法というのを使っていた。この確率的勾配降下法は最急降下法の改良版らしい。SDGの第1引数は学習率を設定する。引数なしだと学習率0.01になるため学習が遅くなる。
lossで損失関数をする。BinaryCrossentropyというのは、交差エントロピー誤差関数を意味する。
compileで定義した最適化関数と損失関数を設定する。compileとなっているので内部で本当にコンパイルしているかもしれない。
13-14行目
学習データの定義。
xが入力データで、yが出力データ。
[0,0] -> [0], [0,1] -> [1], [1,0] -> [1], [1,1] ->[0]
となるように設定している。
15行目
学習を早期終了するためのコールバック関数。
引数monitorで監視する変数、引数min_deltaで最小変化量、引数patienceで連続回数、引数modeで上回ったか・下回ったかを設定する。
ドキュメントでは引数monitorにval_lossを指定するようになっていたが、val_lossを指定すると文句言われたためlossにしてある。
この設定だと、lossの値が、0.0001以下の変化量で、5回連続した場合、早期終了するようになっている。
lossの値が0.001を下回った場合終了という設定にしたかったができなかった。
16行目
学習。
引数epochsに繰り返し学習させる回数、verboseにログ出力の状態を指定する。 verboseは、0でログ出力なし、1で epochごとに プログレスバー出力、2でepochごとに出力になる。 epochsは十分な回数ということで30000を指定してあるが、実際には早期終了になるパターンがほとんどである。
18行目
学習したニューラルネットワークモデルの保存。zドライブ直下にtensorflowtestというファイル名で保存している。
20-23行目
学習した結果の実行。
実行すると以下のように出力される。
[[0.00947068]]
[[0.9870682]]
[[0.99154484]]
[[0.00799964]]
大体あっている数値が出力されている。
学習回数だが、 7043回目で終了している。何回か実行してみたところ 5000-10000くらいで早期終了している。
学習したモデルを読み込む
毎回学習するわけではないので、保存した学習済みニューラルネットワークモデルを読み込むで利用するプログラムも作成した。ソースコードは下記の通り。簡単なので解説なし。
|
import numpy import keras if __name__ == '__main__': model = keras.models.load_model( 'z:\\tensorflowtest') print( model.predict( numpy.array( [ [ 0, 0 ] ] ) ) ) print( model.predict( numpy.array( [ [ 0, 1 ] ] ) ) ) print( model.predict( numpy.array( [ [ 1, 0 ] ] ) ) ) print( model.predict( numpy.array( [ [ 1, 1 ] ] ) ) ) |