edo1z blog

プログラミングなどに関するブログです

TensorFlow - MNISTで機械学習してみる(入力層・出力層のみ)

MNISTを取得する

TensorFlowのチュートリアル用にMNISTが簡単に取り込めるようになっているらしい。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('.', one_hot=True)

上記を実行するとまだMNISTをダウンロードしてない場合はダウンロードしてくれる。

batch_x, batch_t = mnist.train.next_batch(100)

上記を実行すると、100件分のトレーニング用データとトレーニング用正解ラベルをもらえる。numpyの配列としてもらえる。input_data.read_data_setsの引数で、one_hot=Trueにすると、正解ラベルも正解を1、違うものを0とした配列でもらえる。

やってみること

  • MNISTのトレーニングデータで学習して、テストデータでテストする。
  • トレーニングデータは100件ずつ使って学習する。
  • 最も単純な入力層と出力層しかないものを試してみる。

コード

参考:jupyter_tfbook/Chapter02/MNIST softmax estimation.ipynb

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('.', one_hot=True)

x = tf.placeholder(tf.float32, [None, 784])
w = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
f = tf.matmul(x, w) + b
y = tf.nn.softmax(f)
t = tf.placeholder(tf.float32, [None, 10])
loss = -tf.reduce_sum(t * tf.log(y))
train_step = tf.train.AdamOptimizer().minimize(loss)

correct = tf.equal(tf.argmax(y, 1), tf.argmax(t, 1))
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())

i = 0
for _ in range(1500):
    i += 1
    batch_x, batch_t = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_x, t: batch_t})
    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))

Step: 100, Loss: 7747.071777, Accuracy: 0.848400 Step: 200, Loss: 5439.357910, Accuracy: 0.879900 Step: 300, Loss: 4556.465332, Accuracy: 0.890900 Step: 400, Loss: 4132.032715, Accuracy: 0.896100 Step: 500, Loss: 3836.136963, Accuracy: 0.902600 Step: 600, Loss: 3657.867920, Accuracy: 0.904100 Step: 700, Loss: 3498.280762, Accuracy: 0.907500 Step: 800, Loss: 3376.391602, Accuracy: 0.909400 Step: 900, Loss: 3292.480713, Accuracy: 0.910000 Step: 1000, Loss: 3207.918213, Accuracy: 0.912700 Step: 1100, Loss: 3147.843018, Accuracy: 0.914700 Step: 1200, Loss: 3092.903320, Accuracy: 0.916300 Step: 1300, Loss: 3057.232666, Accuracy: 0.915900 Step: 1400, Loss: 3010.664307, Accuracy: 0.916200 Step: 1500, Loss: 2972.114746, Accuracy: 0.917300