TensorFlow - 隠れ層があるニューラルネットをつくる
入力層、出力層の間に隠れそうをつくります。隠れそうが何層あっても対応できるプログラムにしたいと思ったのですが、TensorFlowは事前にモデルをつくるので、forとか使えないかもと思って良くわからなかったし、そもそも単純に層の数が多ければいいってもんじゃないらしいので、隠れ層は2層にしてみます。
コードはこれです。
import tensorflow as tfimport numpy as npfrom tensorflow.examples.tutorials.mnist import input_data
H = 625BATCH_SIZE = 100DROP_OUT_RATE = 0.5
x = tf.placeholder(tf.float32, [None, 784])t = tf.placeholder(tf.float32, [None, 10])w1 = tf.Variable(tf.random_normal([784, H], mean=0.0, stddev=0.05))b1 = tf.Variable(tf.zeros([H]))w2 = tf.Variable(tf.random_normal([H, H], mean=0.0, stddev=0.05))b2 = tf.Variable(tf.zeros([H]))w3 = tf.Variable(tf.random_normal([H, 10], mean=0.0, stddev=0.05))b3 = tf.Variable(tf.zeros([10]))
a1 = tf.sigmoid(tf.matmul(x, w1) + b1)a2 = tf.sigmoid(tf.matmul(a1, w2) + b2)keep_prob = tf.placeholder(tf.float32)drop = tf.nn.dropout(a2, keep_prob)y = tf.nn.relu(tf.matmul(drop, w3) + b3)loss = tf.nn.l2_loss(y - t) / BATCH_SIZE
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)correct = tf.equal(tf.argmax(y, 1), tf.argmax(t, 1))accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))
with tf.Session() as sess: mnist = input_data.read_data_sets('.\mnist', one_hot=True, dtype=tf.uint8) sess.run(tf.global_variables_initializer()) i = 0 for _ in range(20000): i += 1 bx, bt = mnist.train.next_batch(BATCH_SIZE) sess.run([train_step], feed_dict={x:bx, t:bt, keep_prob:(1-DROP_OUT_RATE)}) if not i % 1000: loss_val, acc_val = sess.run([loss, accuracy], feed_dict={x:mnist.test.images, t:mnist.test.labels, keep_prob:1.0}) print ('Step: %d, Loss: %f, Accuracy: %f' % (i, loss_val, acc_val))dropoutをうまく使うと過学習が防げるそうです。うまい使い方はこれから確認しますが、とりあえず参考サイトのように入れてみたら精度は上がりました。あと、lossの計算方法が私の知っているものではないですが、参考サイトと同じように設定してみました。あと、Variableの初期値を全部0にするのはご法度だそうです。最初全部0でやってたけどやめます。非常に小さい数字をランダムに設定するのがよろしいそうです。モデルによって、非常に小さい数値といってもよりよい数値があるそうなので今度やってみます。
2万回やると、精度が0.9713になりました。なんかいい感じの数字になりましたが、CNNをやると99.8%とかになるそうなので、次にやってみます。
Step: 1000, Loss: 33.165092, Accuracy: 0.386300Step: 2000, Loss: 10.525957, Accuracy: 0.898100Step: 3000, Loss: 7.087694, Accuracy: 0.930000Step: 4000, Loss: 5.988323, Accuracy: 0.942400Step: 5000, Loss: 5.395752, Accuracy: 0.948400Step: 6000, Loss: 4.864991, Accuracy: 0.952200Step: 7000, Loss: 4.590996, Accuracy: 0.954400Step: 8000, Loss: 4.247609, Accuracy: 0.958300Step: 9000, Loss: 4.008740, Accuracy: 0.959500Step: 10000, Loss: 3.788574, Accuracy: 0.962100Step: 11000, Loss: 3.686205, Accuracy: 0.963000Step: 12000, Loss: 3.471644, Accuracy: 0.965400Step: 13000, Loss: 3.329534, Accuracy: 0.966200Step: 14000, Loss: 3.216643, Accuracy: 0.966800Step: 15000, Loss: 3.191551, Accuracy: 0.967400Step: 16000, Loss: 3.022474, Accuracy: 0.970000Step: 17000, Loss: 2.946394, Accuracy: 0.968600Step: 18000, Loss: 2.848071, Accuracy: 0.970000Step: 19000, Loss: 2.786939, Accuracy: 0.970300Step: 20000, Loss: 2.756026, Accuracy: 0.971300参考: 落ちこぼれないためのTensorFlow Tutorialコード TensorFlowで機械学習と戯れる: AutoEncoderを作ってみる