ここのサイトに、人工知能でめちゃくちゃ簡単なソースコードがあった。
TensorFlowのコード分割の考え方 - Qiita

じゃんけんらしい。


上から順番に説明すると

input = [自分のグー、チョキ、パー]
wininng_hands = [inputに勝つ手]


用意するデータは以上!


さて、ニューラルネットワークの構造は、
x = tf.placeholder("float", [None, 3])

つまりXは、3つ。

図で書くと


そして次に

W = tf.Variable(tf.zeros([3, 3]))

xが3個。x1つに対してエッジが3本という意味になっている。


図にすると





そして、w1からw9は、全部0。中にある tf.zeros で0になってる。

次に
b = tf.Variable(tf.zeros([3]))

これは、バイアスと言うやつだね。

第2回 人工知能で紹介した動画で解説されてるやつ。


図に足すと

次に

y = tf.nn.softmax(tf.matmul(x, W) + b)

これは、2つに分けて考えると

まず、xとWを掛けてbを足すという計算になっています。

そして、その答えをソフトマックス関数を使って、0~1の間で答えを出す方式になっています。

図に表すと



ニューラルネットワーク自体はここまでで、後は評価計算。

でも意図的に分かりやすくするために、図に追加していく。

y_ = tf.placeholder("float", [None, 3])


これは、教師ありとして答えを入れるところのプレースホルダー

図に書くと


で、次。


これはかなり重要です。
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

この計算、ちょっと複雑に見えます。

この-tf.reduce_sum(y_ * tf.log(y))というのは、もう公式で覚えたほうが早いです。

これは、答えと実際に計算したときどのくらいの誤差があったかを計算する式です。

コスト関数とか損失関数とか言うらしいです。

図に足すと



はい、では次

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

これもさっきの損失関数と同様重要です。

損失関数は、誤差を計算しただけです。その誤差を学習してこそ機械学習です。

その誤差を修正してニューラルネットワークをより正解へ近づけるのが

GradientDescentOptimizerです。

使い方は、
train_step = tf.train.GradientDescentOptimizer([精度]).minimize([誤差])

になります。

図に足すと



これで計算は終わりました。

あとは、初期化とプログラムを走らせばオーケーです。

まずは初期化の指示を登録。
init = tf.initialize_all_variables()

これだけでは実行しません。あくまで指示の登録。

次に
feed_dict={x: input, y_: winning_hands}

データですね。
y_は、教師データですね。
feed_dictで代入指示ですが、見てとおり、プレースホルダーに代入指示しています。


さぁ準備が整いました。実行です。

with tf.Session() as sess:
  sess.run(init)


これは、初期化をしなさいという指示を実行しなさいになっています。

さて、次。

1000回、学習させます。下の%100というのは、100回ごとに実行しなさいというpython命令です。

  for step in range(1000):
    sess.run(train_step, feed_dict=feed_dict)

    if step % 100 == 0:
      print sess.run(cross_entropy, feed_dict=feed_dict)


あとは、学習していきます。