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

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

[MDT-03] 畳込みフィルターが1層のCNNを表現するクラスを定義します。


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

    def prepare_model(self, num_filters, num_units):
        num_units1 = 14*14*num_filters
        num_units2 = num_units
        
        with tf.name_scope('input'):
            x = tf.placeholder(tf.float32, [None, 784], name='input')
            x_image = tf.reshape(x, [-1,28,28,1])

        with tf.name_scope('convolution'):
            W_conv = tf.Variable(
                tf.truncated_normal([5,5,1,num_filters], stddev=0.1),
                name='conv-filter')
            h_conv = tf.nn.conv2d(
                x_image, W_conv, strides=[1,1,1,1], padding='SAME',
                name='filter-output')

        with tf.name_scope('pooling'):            
            h_pool =tf.nn.max_pool(h_conv, ksize=[1,2,2,1],
                                   strides=[1,2,2,1], padding='SAME',
                                   name='max-pool')
            h_pool_flat = tf.reshape(h_pool, [-1, 14*14*num_filters],
                                     name='pool-output')

        with tf.name_scope('fully-connected'):
            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,
                                 name='fc-output')

        with tf.name_scope('softmax'):
            w0 = tf.Variable(tf.zeros([num_units2, 10]))
            b0 = tf.Variable(tf.zeros([10]))
            p = tf.nn.softmax(tf.matmul(hidden2, w0) + b0,
                              name='softmax-output')
            
        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(0.0005).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("convolution_filters", W_conv)
        
        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_df_logs", sess.graph)
        
        self.sess = sess
        self.summary = summary
        self.writer = writer

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


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

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


In [5]:
cnn = SingleCNN(16, 1024)

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


Step: 50, Loss: 2708.204834, Accuracy: 0.921400
Step: 100, Loss: 2065.065674, Accuracy: 0.940600
Step: 150, Loss: 1743.759277, Accuracy: 0.949800
Step: 200, Loss: 1752.073730, Accuracy: 0.946300
Step: 250, Loss: 1411.914062, Accuracy: 0.956400
Step: 300, Loss: 1361.255981, Accuracy: 0.960100
Step: 350, Loss: 1213.909302, Accuracy: 0.961100
Step: 400, Loss: 1174.215088, Accuracy: 0.963200
Step: 450, Loss: 1109.834473, Accuracy: 0.966100
Step: 500, Loss: 1111.124878, Accuracy: 0.966000
Step: 550, Loss: 1157.716309, Accuracy: 0.964300
Step: 600, Loss: 974.313232, Accuracy: 0.968500
Step: 650, Loss: 972.929199, Accuracy: 0.968200
Step: 700, Loss: 981.666870, Accuracy: 0.969700
Step: 750, Loss: 881.028687, Accuracy: 0.971900
Step: 800, Loss: 887.299805, Accuracy: 0.969700
Step: 850, Loss: 832.756958, Accuracy: 0.973600
Step: 900, Loss: 940.184204, Accuracy: 0.970300
Step: 950, Loss: 798.565918, Accuracy: 0.973600
Step: 1000, Loss: 788.489685, Accuracy: 0.975500
Step: 1050, Loss: 857.048218, Accuracy: 0.973100
Step: 1100, Loss: 723.749268, Accuracy: 0.977200
Step: 1150, Loss: 697.981323, Accuracy: 0.977800
Step: 1200, Loss: 728.123047, Accuracy: 0.978200
Step: 1250, Loss: 675.196655, Accuracy: 0.977800
Step: 1300, Loss: 975.464050, Accuracy: 0.971000
Step: 1350, Loss: 803.838013, Accuracy: 0.973500
Step: 1400, Loss: 701.997803, Accuracy: 0.977800
Step: 1450, Loss: 735.931396, Accuracy: 0.975900
Step: 1500, Loss: 715.306213, Accuracy: 0.976600
Step: 1550, Loss: 637.059143, Accuracy: 0.980000
Step: 1600, Loss: 750.055786, Accuracy: 0.975500
Step: 1650, Loss: 753.287903, Accuracy: 0.976800
Step: 1700, Loss: 620.819946, Accuracy: 0.980100
Step: 1750, Loss: 653.246338, Accuracy: 0.979100
Step: 1800, Loss: 646.240906, Accuracy: 0.978400
Step: 1850, Loss: 615.703613, Accuracy: 0.979600
Step: 1900, Loss: 636.873657, Accuracy: 0.979900
Step: 1950, Loss: 675.588684, Accuracy: 0.978300
Step: 2000, Loss: 630.352295, Accuracy: 0.980500
Step: 2050, Loss: 677.331299, Accuracy: 0.978300
Step: 2100, Loss: 709.061768, Accuracy: 0.977600
Step: 2150, Loss: 664.476929, Accuracy: 0.978700
Step: 2200, Loss: 609.256226, Accuracy: 0.981200
Step: 2250, Loss: 623.274048, Accuracy: 0.980400
Step: 2300, Loss: 592.468140, Accuracy: 0.982900
Step: 2350, Loss: 616.126221, Accuracy: 0.980700
Step: 2400, Loss: 587.085205, Accuracy: 0.981400
Step: 2450, Loss: 629.551819, Accuracy: 0.979300
Step: 2500, Loss: 663.284180, Accuracy: 0.979000
Step: 2550, Loss: 625.762695, Accuracy: 0.980300
Step: 2600, Loss: 661.679443, Accuracy: 0.978900
Step: 2650, Loss: 638.485779, Accuracy: 0.980000
Step: 2700, Loss: 658.039856, Accuracy: 0.980300
Step: 2750, Loss: 634.342041, Accuracy: 0.981000
Step: 2800, Loss: 642.392639, Accuracy: 0.980300
Step: 2850, Loss: 631.872803, Accuracy: 0.980800
Step: 2900, Loss: 654.673828, Accuracy: 0.979900
Step: 2950, Loss: 649.062012, Accuracy: 0.981000
Step: 3000, Loss: 572.120850, Accuracy: 0.984000
Step: 3050, Loss: 599.065735, Accuracy: 0.984100
Step: 3100, Loss: 659.009277, Accuracy: 0.980100
Step: 3150, Loss: 657.855652, Accuracy: 0.981500
Step: 3200, Loss: 640.498291, Accuracy: 0.982600
Step: 3250, Loss: 602.131348, Accuracy: 0.983000
Step: 3300, Loss: 612.919312, Accuracy: 0.982100
Step: 3350, Loss: 688.271362, Accuracy: 0.981200
Step: 3400, Loss: 639.590515, Accuracy: 0.981200
Step: 3450, Loss: 621.670288, Accuracy: 0.983200
Step: 3500, Loss: 593.942261, Accuracy: 0.982400
Step: 3550, Loss: 759.176758, Accuracy: 0.977700
Step: 3600, Loss: 649.090149, Accuracy: 0.982600
Step: 3650, Loss: 668.754761, Accuracy: 0.981300
Step: 3700, Loss: 651.726196, Accuracy: 0.980600
Step: 3750, Loss: 724.057190, Accuracy: 0.980900
Step: 3800, Loss: 683.142090, Accuracy: 0.979600
Step: 3850, Loss: 699.129639, Accuracy: 0.979800
Step: 3900, Loss: 691.230957, Accuracy: 0.981100
Step: 3950, Loss: 702.985657, Accuracy: 0.979800
Step: 4000, Loss: 636.992615, Accuracy: 0.982200