2016年5月23日月曜日

[TensorFlowのチュートリアル] MNIST For ML Beginnersを動かしてみました

前回、Windows10<-VirtualBox<-Ubuntu<-TensorFlowをインストールしました。
今回は、チュートリアルの「MNIST For ML Beginners」という手書き文字(数字)の認識プログラムを動かしてみようと思います。
参考にしたページは「TensorFlow - MNIST For ML Beginners」です。

操作手順は、
  1. Google Gitのminstのページからtgzをダウンロードして解凍する。
  2. 解凍されたファイルの中から、input_data.pyとmnist_softmax.pyをPythonの作業用フォルダへコピー。
  3. minist_softmax.pyを実行
結果、手書き文字データがダウンロードされ、認識率が0.9022とサンプルプログラムが簡単に動くことが確認できました。

次にサンプルプログラムの中身を見てみました。

mnist_softmax.pyの中身
# Copyright 2015 Google Inc. All Rights Reserved.... 
著作権のはなしですねとりあえず読み飛ばします。

"""A very simple MNIST classifier.
See extensive documentation at
http://tensorflow.org/tutorials/mnist/beginners/index.md
"""
ドキュメントへのリンクが書いています、英語ですがそれほど難しくないと思います。
面倒なので読んでいませんが。。。
手書きの数字の画像をSoftmax回帰をもちいて認識していますよ的なことがわかりやすくかかれていそうです。英語が得意ではない人は日本語訳を見ましょう。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
何かをインポートしてますが、よく分からないので飛ばします。

# Import data
from tensorflow.examples.tutorials.mnist import input_data
input_data=データをインポートするライブラリ
機械学習系のライブラリーを使うときにはデータのインポートでつまずくことが多いので、別途調べたいと思います。

import tensorflow as tf
tensorflowのインポート

mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
データをインポート

sess = tf.InteractiveSession()
データをインポートして、tfのセッションを作っています。こちらやこちらをみるとセッションとはCPUやGPUで実際の計算をマネージメントするくらすみたいです。

#Define loss and optimizer 
y_ = tf.placeholder(tf.float32, [None, 10]) 
プレースホルダーの設定、プレーフォルダーはデータを入れておく変数らしい。

cross_entropy = -tf.reduce_sum(y_ * tf.log(y))  
損失関数の設定(クロスエントロピー法)

rain_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
最適化手法の設定 勾配降下法、ステップサイズ0.01、cross_entropyを最小化する。

# Traintf.initialize_all_variables().run()
パラメーターの初期化

for i in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100) #ランダムに100セットの学習データを取り出す。
  train_step.run({x: batch_xs, y_: batch_ys}) #学習する
1バッチ(100)データずつの学習を1000回行っています。
いわゆる確率的勾配降下法ってやつですね。

# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
予測値と実値があっているかどうかの配列を作成。argmaxは引数のなかで一番大きい値のindexつまり、推定される数字を取り出す。

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
予測値と実値があっているかどうかの配列から精度を算出

print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))
精度を出力。



以上、ざっとサンプルプログラムに目を通してみましたが、機械学習のプログラムのパターン
学習データ準備 → モデル定義 → 学習 → 検証となっていることがわかりました。
もう少し詳しく調べてから次のチュートリアルに行きたいと思います。

0 件のコメント:

コメントを投稿