TensorFlow実験 その1

  1. はじめに
  2. ソースコード
  3. ソースコード解説
  4. 学習したモデルを読み込む

はじめに

TensorFlowの動作実験をする。Pythonを使うのは初めてなので書き方が変なところがあるかもしれない。TensorFlow(Keras)の実験が主なので、ニューラルネットワークが何なのかわからない人はほかのページや文献を当たって欲しい。

実験内容は以下の通り。

  • 3層ニューラルネットワーク(ディープラーニングではない)
  • 学習対象はXOR

ソースコード

できあがったソースコードは以下の通り。

ソースコード解説

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くらいで早期終了している。

学習したモデルを読み込む

毎回学習するわけではないので、保存した学習済みニューラルネットワークモデルを読み込むで利用するプログラムも作成した。ソースコードは下記の通り。簡単なので解説なし。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です