MNISTコードはTensorFlowのチュートリアルの1つです。
原文コードはこちら
https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/examples/tutorials/mnist/mnist_softmax.py
def main(_):
defはpythonの関数定義らしい。mainと名前が付いているがエントリポイントではなさげ。
関数は{}中かっこで開始と終了を表すのではなく、インデントで表現してるっぽい。
他の言語以上にインデントが重要ですね。引数の「_」はなんでしょうね…
引数なし関数っぽいのですが、調べてもうまく出てこなかったorz まぁいいや。
# Import data
mnist = input_data.read_data_sets(FLAGS.data_dir)
最初にデータを読み込んでいる。
中身は28×28のグレースケール画像で、28×28=784次元ベクトルとして扱う様子
# Create the model
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.matmul(x, W) + b
# Define loss and optimizer
y_ = tf.placeholder(tf.int64, [None])
はい、ここですね。一瞬わからんくなりましたが。
[None, 784]
↑列 ↑行です。行と列を逆に思い込んでしまったので混乱しました。
[784, 10]
↑列 ↑行です。
[10]
↑列です。
分かれば、大したことないですね。
xには最初のmnist画像が放り込まれます。
Noneは画像の個数で、最初には未定義でいいらしい。便利
tf.placeholderは実行時に値を渡せばいいらしいですが、tf.Variableでも行けそうな
気配はしてます。あかんのかな。(知識不足)
最終的に欲しいのは10次元の列ベクトルなので、この式になります。
[784行,x列] × [10行,784列] + [10列] = 出力は10次元の列ベクトル
y = tf.matmul(x, W) + b
y = ax + bの直線の方程式を求めるのと似てますね。
xとyが決まっていて、aとbを学習によって求めようというアプローチです。(たぶん)
x = 画像
y = 0〜9の数値を表す結果
a(W) = 画素ごとの重み(特徴量)
b = バイアス
続きはまた!