初心者による初心者の為のTensorFlowを使用したMNIST for ML Beginnersを解説。
どうも、たっきーです。
機械学習のHello worldと呼ばれるているMNISTってやつを試してみたので覚書き。
はじめに
今回は本当に触ってみただけなので、中のロジックとか数式の意味とか割りと理解してないし、ブラックボックス的にTensorflowを使いました。
どのようなロジックで手書き文字の学習がされているのか正直わからん。(ザコ)
TensorFlow公式ドキュメントを参照。
MNISTとは
「Mixed National Institute of Standards and Technology database」の略で、機械学習のHello worldと呼ばれるているヤツ。
アメリカ国立標準技術研究所(National Institute of Standards and Technology, NIST)が提供するデータ。
28×28の784個のピクセルの0〜9の手書き数字のデータセットのこと。55000個の学習データ (mnist.train)と10000個のテストデータ (mnist.test)と5000個の検証用データ (mnist.validation) が画像データとメタデータとしてどの数字を表すのかをラベルデータが与えられている。
今回、手書き文字の推定をするプログラムを作りたい。
環境の整え方などは前の記事を参照。
TensorFlowの処理の流れ
- TensorFlow読み込み
- 式を立てる(モデル)
- セッションを開始
- 式を実行(run)
機械学習の3ステップ
- 現象をモデル化する
- モデルを最適化するパラメータを求める
- 学習したモデルを使用して推定・分類
このチュートリアルで何をするか
MNISTデータとソフトマックス回帰について学ぶ。
イメージ内のすべてのピクセルを調べることに基づいて、数字を認識するためのモデルを作成する。
TensorFlowを使用して、学習データを見て数字を認識させるようにモデルを訓練します。
テストデータでモデルの精度をチェックする。
実装
早速チュートリアルのコードを実装してみる。
from tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
MNIST_data/ がダウンロード先。
まずはこのコマンドで必要なものをダウンロード。
import tensorflow as tf
TensorFlowをtfとしてインポート
x = tf.placeholder(tf.float32, [None, 784])
placeholderという入れ物を用意する。イメージ的にC言語で言う int i; みたいなもんかな?(違う?)
一応よく使うヤツなので使い方↓
placeholder(shape=None, #与えられる行列の形状(オプション)。形状が指定されていない場合は、任意の形状のテンソルを供給することができます。name=None #操作の名前(オプション)。)
次に、変数を定義。
W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))
Variableは変数のこと。zerosで0で埋めてあげる。
Wは重み、bはバイアス。
10は0〜9の数字があるので。
y = tf.nn.softmax(tf.matmul(x, W) + b)
確率を格納する為の変数をyとする。matmul は行列の掛け算。
y_ = tf.placeholder(tf.float32, [None, 10])
ここ(y_)に正解データ(ラベルデータっていうのかな?)を格納する。
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
cross_entoropyに推定値とラベルデータの差分
ぶっちゃけこの計算のロジックはわからん。教えてくれ。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
train_stepが学習ステップ。重みを最適化して更新する。
GradientDescentOptimizerは勾配降下法のことっぽい。()の中は学習率。
参考までに、TensorFlowのOptimizer一覧(
https://www.tensorflow.org/api_guides/python/train#optimizers
)cross_entropyをminimizeで小さくなるように学習する。
sess = tf.InteractiveSession()tf.global_variables_initializer().run()
これはオマジナイ。心を無にするのだ。
for _ in range(1000):batch_xs, batch_ys = mnist.train.next_batch(100)sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
for文で1000回、バッチ(100個のランダムで選択したデータを入れたもの)でtrainする。feed_dictでxにbatch_xs, yにbatch_ysを指定する。placeholderには、feed_dictを通じて値を外挿できる。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
結果の評価をする。推測とラベルデータの差を評価。argmax()で行列の中で最も大きな値(確率が一番大きいやつ)を持っているところを一つ取ってくるヤツ。
equal(a,b)でa=bならTrue, a≠bならFalseを吐く。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
reduce_meanで精度の平均値を出す。
True,Falseでは計算出来ないのでcastで数値(割合)に変換。
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
print文で計算結果を出力する。
ちなみに僕は91.87%の精度でした。
だがしかしこれはまだ深層学習ではない
だがしかしこれはまだ深層学習(Deep Leaning)ではない。(大事なことなので(ry)
TensorFlowで学ぶディープラーニング入門 ~畳み込みニューラルネットワーク徹底解説~
- 作者: 中井悦司
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/09/27
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
最後に
なんとなく考えとか整理するのに書き始めたけど、アレ(遅い)。
こうやってブログに起こすのめんどくさいだけで、実はTensorFlowのチュートリアルは一通りやった。
ただこうやって書いてて実は理解してなかったところとかを発見出来たりするのでよい。
公式ドキュメントの最後らへんに
Is that good? Well, not really. In fact, it's pretty bad. This is because we're using a very simple model. With some small changes, we can get to 97%. The best models can get to over 99.7% accuracy!
ってあるけどかっこよすぎん?(?) まだ力を秘めているボス的な感覚。
TensorFlow「まだ本気じゃねえんだぜ…!」って。