TensorFlow始めました その3。1次直線の傾きと切片を機械学習で求める。

TensorFlow始めました。
TensorFlow始めました その2。placeholderを使う。
の続きです。

いよいよ、TensorFlowで機械学習にチャレンジします。
TensorFlowのGetting Started With TensorFlow“に習って、一次直線 y = W * x + bの傾きWと切片bを機械学習で求めてみます。

1. インポート

TensorFlowをインポート。

2. モデルパラメータとモデル式

モデルパラメータWとbをtf.Variable()で変数として定義します。tf.Variableで定義した変数は、後に行う機械学習によって自動的に更新されていき、徐々に最適な解に収束していきます。
確率密度が正規分布である乱数を生成するtf.random_normal()を用いて、Wとbの初期値を設定しました。なお引数は次の条件を設定しています。

  1. [1]: rank1かつ長さ1であるshapeのtensorを作成
  2. meas=0.0: 乱数の平均値=0.0
  3. sttdev=1.0: 乱数の標準偏差=1.0
  4. dtype=tf.float32: 32bit浮動小数点数

 

続いてモデル式の定義です。

linear_model が一次関数の定義式です。その入出力x及びyをplaceholdeerで定義しています。
後の機械学習の際には、placeholderであるxとyに教師データが渡され、VariableであるWとbが自動的に最適値に収束していきます。

3. 教師データ

linear_moderに与える教師データを用意します。xに与えるデータがx_train。yに与えるデータがy_trainです。

具体的に代入してみると、

0.0 = W * 1.0 + b
-1.0 = W * 2.0 + b
-2.0 = W * 3.0 + b
-3.0 = W * 4.0 + b

となります。

十分に学習を積んでいる私piの脳細胞は、5秒ほどでW = -1.0, b = 1.0をはじき出すわけですが、これをTensorFlowにやらせようというのが本エントリーの趣旨です。

4. いざ機械学習

モデル式linear_mode = W * x + bの、教師データx_trainがxに、教師データy_trainがyに入力されます。そして、linear_modelとyとの差を二乗和した損失lossが、勾配降下法によって最小となるように機械学習が行われる設定です。

 

次にtf.Variableで定義した変数(W及びb)を初期化します。

 

ここからが機械学習のメインループになります。
学習データを使って反復学習。100回毎にW, b, lossを表示します。

 

全ソースコードを次に掲載します。

 

実行してみました。
学習回数(step)が1200回あたりでlossが最小の4.2E-12に収束しました。そのときのWはおよそ-1.0、bはおよそ1.0です。
機械学習によって一次直線のWとbを求めることが出来ました。