[MST-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(20160612)
tf.set_random_seed(20160612)

[MST-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

[MST-03] 単層ニューラルネットワークを表現するクラスを定義します。


In [3]:
class SingleLayerNetwork:
    def __init__(self, num_units):
        with tf.Graph().as_default():
            self.prepare_model(num_units)
            self.prepare_session()

    def prepare_model(self, num_units):
        with tf.name_scope('input'):
            x = tf.placeholder(tf.float32, [None, 784], name='input')
        
        with tf.name_scope('hidden'):
            w1 = tf.Variable(tf.truncated_normal([784, num_units]),
                             name='weights')        
            b1 = tf.Variable(tf.zeros([num_units]), name='biases')
            hidden1 = tf.nn.relu(tf.matmul(x, w1) + b1, name='hidden1')
        
        with tf.name_scope('output'):
            w0 = tf.Variable(tf.zeros([num_units, 10]), name='weights')
            b0 = tf.Variable(tf.zeros([10]), name='biases')
            p = tf.nn.softmax(tf.matmul(hidden1, w0) + b0, name='softmax')

        with tf.name_scope('optimizer'):
            t = tf.placeholder(tf.float32, [None, 10], name='labels')
            loss = -tf.reduce_sum(t * tf.log(p), name='loss')
            train_step = tf.train.AdamOptimizer().minimize(loss)

        with tf.name_scope('evaluator'):
            correct_prediction = tf.equal(tf.argmax(p, 1), tf.argmax(t, 1))
            accuracy = tf.reduce_mean(tf.cast(correct_prediction,
                                              tf.float32), name='accuracy')

        tf.summary.scalar("loss", loss)
        tf.summary.scalar("accuracy", accuracy)
        tf.summary.histogram("weights_hidden", w1)
        tf.summary.histogram("biases_hidden", b1)
        tf.summary.histogram("weights_output", w0)
        tf.summary.histogram("biases_output", b0)
                
        self.x, self.t, self.p = x, t, p
        self.train_step = train_step
        self.loss = loss
        self.accuracy = accuracy
            
    def prepare_session(self):
        sess = tf.InteractiveSession()
        sess.run(tf.global_variables_initializer())
        summary = tf.summary.merge_all()
        writer = tf.summary.FileWriter("/tmp/mnist_sl_logs", sess.graph)
        
        self.sess = sess
        self.summary = summary
        self.writer = writer

[MST-04] TensorBoard用のデータ出力ディレクトリーを削除して初期化しておきます。


In [4]:
!rm -rf /tmp/mnist_sl_logs

[MST-05] パラメーターの最適化を2000回繰り返します。テストセットに対して、約97%の正解率が得られます。


In [5]:
nn = SingleLayerNetwork(1024)

i = 0
for _ in range(2000):
    i += 1
    batch_xs, batch_ts = mnist.train.next_batch(100)
    nn.sess.run(nn.train_step, feed_dict={nn.x: batch_xs, nn.t: batch_ts})
    if i % 100 == 0:
        summary, loss_val, acc_val = nn.sess.run(
            [nn.summary, nn.loss, nn.accuracy],
            feed_dict={nn.x:mnist.test.images, nn.t: mnist.test.labels})
        print ('Step: %d, Loss: %f, Accuracy: %f'
               % (i, loss_val, acc_val))
        nn.writer.add_summary(summary, i)


Step: 100, Loss: 2796.766846, Accuracy: 0.917100
Step: 200, Loss: 2213.966797, Accuracy: 0.936300
Step: 300, Loss: 1894.296631, Accuracy: 0.941900
Step: 400, Loss: 1684.915527, Accuracy: 0.949700
Step: 500, Loss: 1546.350586, Accuracy: 0.954600
Step: 600, Loss: 1382.992676, Accuracy: 0.958500
Step: 700, Loss: 1252.171387, Accuracy: 0.964200
Step: 800, Loss: 1240.292480, Accuracy: 0.964400
Step: 900, Loss: 1384.828857, Accuracy: 0.961100
Step: 1000, Loss: 1265.508789, Accuracy: 0.964300
Step: 1100, Loss: 1157.814087, Accuracy: 0.966700
Step: 1200, Loss: 1049.277100, Accuracy: 0.970000
Step: 1300, Loss: 1082.889282, Accuracy: 0.969500
Step: 1400, Loss: 1109.864380, Accuracy: 0.968700
Step: 1500, Loss: 1080.051514, Accuracy: 0.968200
Step: 1600, Loss: 1115.767456, Accuracy: 0.966900
Step: 1700, Loss: 1000.195374, Accuracy: 0.973800
Step: 1800, Loss: 979.433105, Accuracy: 0.972300
Step: 1900, Loss: 1178.969238, Accuracy: 0.967400
Step: 2000, Loss: 944.843628, Accuracy: 0.973500