2016/04/16 機械学習 名古屋 第3回勉強会
以下の環境を前提とします。
インストールの詳細省略。
インストールが成功していれば、Python のインタラクティブシェル(もしくは ipython, Jupyter 等)で↓以下のようにすれば利用開始。
import tensorflow as tf
※ 今回は TensorBoard は不使用。
TensorFlow では、以下のようにすると MNIST データセット(訓練データおよびテストデータ)を扱えるようになる:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
※↑データが存在しなければネットワーク経由でダウンロードから開始。
ダウンロード後(or ダウンロード済のデータが存在する場合)そのデータを読み込んでくれる。
※⇒既にダウンロード済のデータ(4つの.gzファイル)を持っていたらそれを所定の場所に置いておくだけでもOK。
# 訓練データ:長さ784のベクトルデータ(=28x28 の画像データ)
x = tf.placeholder(tf.float32, [None, 784])
# 正解データ:長さ10のベクトルデータ(0,1,…,9 の対応する要素のみ 1、他は 0)
d = tf.placeholder(tf.float32, [None, 10])
W1 = tf.Variable(tf.random_normal([784, 128], mean=0.0, stddev=0.05))
b1 = tf.Variable(tf.zeros([128]))
z1 = tf.nn.relu(tf.matmul(x, W1) + b1)
W2 = tf.Variable(tf.random_normal([128, 64], mean=0.0, stddev=0.05))
b2 = tf.Variable(tf.zeros([64]))
z2 = tf.nn.relu(tf.matmul(z1, W2) + b2)
W3 = tf.Variable(tf.random_normal([64, 10], mean=0.0, stddev=0.05))
b3 = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(z2, W3) + b3)
x_entropy = -tf.reduce_sum(d * tf.log(y))
tf.train.GradientDescentOptimizer
を利用した例を示す。tf.train.AdagradOptimizer
、tf.train.MomentumOptimizer
等を利用しても良い。optimizer = tf.train.GradientDescentOptimizer(0.01)
train_step = optimizer.minimize(x_entropy)
init = tf.initialize_all_variables()
※↑これも「変数を初期化する」という命令を宣言しているだけ。
この後 sess.run(init)
することで(そのセッション内で実際に)変数の初期化が実行される。
sess = tf.Session()
sess.run(init)
# ↑実際にはここで始めて各変数が初期化される
今回は分かりやすくするため、ループ中にも随時精度を確認してみる。
そのため先に精度を確認する各種準備。
# y(=学習結果の出力)と d(正解データ)で一致しているかどうかを確認
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(d, 1))
# 平均(=一致している個数÷全データ数)を計算
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# ループ回数は 2000回
# バッチサイズは 100
# 200イテレーションごとに現在の精度を算出し出力
for i in range(1, 2001):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, d: batch_ys})
if i % 200 == 0:
train_accuracy = sess.run(accuracy, feed_dict={x: batch_xs, d: batch_ys})
print(' step, accurary = %6d: %6.3f' % (i, train_accuracy))
テストデータを利用して精度の確認。
print(sess.run(accuracy, feed_dict={x: mnist.test.images, d: mnist.test.labels}))
↑だいたい0.96前後になる(と思われます)。
matplotlib が入っている場合、以下を実行して実際のデータと推測結果を確認してみる。
%matplotlib inline
# ↑Jupyter 上で実行するときに必要
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random
n = len(mnist.test.images)
i = random.randrange(n)
imageData = mnist.test.images[i]
label = mnist.test.labels[i]
result = sess.run(y, feed_dict={x: [imageData], d: [label]})
print("Classified as: %d" % np.argmax(result))
image = np.reshape(imageData, [28, 28])
plt.imshow(image, cmap = cm.Greys)
# plt.show()
# ↑Jupyter 以外では必要
tf.train.GradientDescentOptimizer
の代わりに、tf.train.AdagradOptimizer
や tf.train.MomentumOptimizer
を試してみる。optimizer = tf.train.MomentumOptimizer(0.1, 0.9)
とするだけでもかなり変わる(はず)