[MDC-01] 必要なモジュールをインポートして、乱数のシードを設定します。


In [1]:
%matplotlib inline
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

np.random.seed(20160703)
tf.set_random_seed(20160703)


/Users/tetsu/.pyenv/versions/miniconda2-latest/envs/py35/lib/python3.5/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters

[MDC-02] MNISTのデータセットを用意します。


In [2]:
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)


Extracting /tmp/data/train-images-idx3-ubyte.gz
Extracting /tmp/data/train-labels-idx1-ubyte.gz
Extracting /tmp/data/t10k-images-idx3-ubyte.gz
Extracting /tmp/data/t10k-labels-idx1-ubyte.gz

[MDC-03] フィルターに対応する Variable を用意して、入力データにフィルターとプーリング層を適用する計算式を定義します。


In [3]:
num_filters = 16

x = tf.placeholder(tf.float32, [None, 784])
x_image = tf.reshape(x, [-1,28,28,1])

W_conv = tf.Variable(tf.truncated_normal([5,5,1,num_filters],
                                         stddev=0.1))
h_conv = tf.nn.conv2d(x_image, W_conv,
                      strides=[1,1,1,1], padding='SAME')
h_pool =tf.nn.max_pool(h_conv, ksize=[1,2,2,1],
                       strides=[1,2,2,1], padding='SAME')

[MDC-04] プーリング層からの出力を全結合層を経由してソフトマックス関数に入力する計算式を定義します。


In [4]:
h_pool_flat = tf.reshape(h_pool, [-1, 14*14*num_filters])

num_units1 = 14*14*num_filters
num_units2 = 1024

w2 = tf.Variable(tf.truncated_normal([num_units1, num_units2]))
b2 = tf.Variable(tf.zeros([num_units2]))
hidden2 = tf.nn.relu(tf.matmul(h_pool_flat, w2) + b2)

w0 = tf.Variable(tf.zeros([num_units2, 10]))
b0 = tf.Variable(tf.zeros([10]))
p = tf.nn.softmax(tf.matmul(hidden2, w0) + b0)

[MDC-05] 誤差関数 loss、トレーニングアルゴリズム train_step、正解率 accuracy を定義します。


In [5]:
t = tf.placeholder(tf.float32, [None, 10])
loss = -tf.reduce_sum(t * tf.log(p))
train_step = tf.train.AdamOptimizer(0.0005).minimize(loss)
correct_prediction = tf.equal(tf.argmax(p, 1), tf.argmax(t, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

[MDC-06] セッションを用意して、Variable を初期化します。


In [6]:
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
saver = tf.train.Saver()

[MDC-07] パラメーターの最適化を4000回繰り返します。

最終的に、テストセットに対して約98%の正解率が得られます。


In [ ]:
i = 0
for _ in range(4000):
    i += 1
    batch_xs, batch_ts = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, t: batch_ts})
    if i % 100 == 0:
        loss_val, acc_val = sess.run([loss, accuracy],
            feed_dict={x:mnist.test.images, t:mnist.test.labels})
        print ('Step: %d, Loss: %f, Accuracy: %f'
               % (i, loss_val, acc_val))
        saver.save(sess, './mdc_session', global_step=i)


Step: 100, Loss: 2386.908203, Accuracy: 0.928200
Step: 200, Loss: 2044.000732, Accuracy: 0.937100
Step: 300, Loss: 1424.420532, Accuracy: 0.958200
Step: 400, Loss: 1163.067871, Accuracy: 0.963400
Step: 500, Loss: 1059.539795, Accuracy: 0.969000
Step: 600, Loss: 997.609009, Accuracy: 0.968800
Step: 700, Loss: 1049.022217, Accuracy: 0.969500
Step: 800, Loss: 871.817078, Accuracy: 0.974000
Step: 900, Loss: 842.284180, Accuracy: 0.974200
Step: 1000, Loss: 902.164978, Accuracy: 0.971900
Step: 1100, Loss: 822.764771, Accuracy: 0.974700
Step: 1200, Loss: 879.963867, Accuracy: 0.973200
Step: 1300, Loss: 1003.915283, Accuracy: 0.971400
Step: 1400, Loss: 776.196899, Accuracy: 0.976700
Step: 1500, Loss: 834.555908, Accuracy: 0.975100
Step: 1600, Loss: 713.446106, Accuracy: 0.977500
Step: 1700, Loss: 690.397034, Accuracy: 0.979800
Step: 1800, Loss: 705.258362, Accuracy: 0.977600
Step: 1900, Loss: 666.985962, Accuracy: 0.979500
Step: 2000, Loss: 713.946167, Accuracy: 0.978300

[MDC-08] セッション情報を保存したファイルが生成されていることを確認します。


In [ ]:
!ls mdc_session*