ウォンツテック

そでやまのーと

TensorFlowを使ってみる 4

畳み込みニューラルネットワークチュートリアルをやってみる

Deep MNIST for Experts  |  TensorFlow

このページの「Build a Multilayer Convolutional Network」以下をやってみました

※mnistは「ゼロから作るDeepLearning本」の方で取得したデータを利用するように変えてあります

気になった所をいくつか抜粋

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)

def main(_):
    ...
    W_conv1 = weight_variable([5, 5, 1, 32])

フィルターのtensorの順序がゼロから作る本と違う。
内部的には正しい計算をしているはずなのでいいとして、TensorFlowのConvolutionの順序は縦、横、チャネル(色)、アウトプットチャネルです。

def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

stridesに渡す配列の0と3番目の要素は必ず1とし、中の二つの値(同じにする)がstrideとなる。
この場合はstrideが1。
paddingは2種類「SAME」と「VALID」を指定出来てSAMEの場合は入力と出力のサイズが同じになるように自動でpaddingを調整してくれる。VALIDの場合は何もせず。
max_pool_2x2で定義されているstridesとpaddingも同じ。ksizeはpoolフィルタのサイズで2x2。

    W_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

2回のpoolフィルタで28x28x1→ 14x14x32→ 7x7x64までになったデータを一旦1024個のニューロンに出力してます(Affine変換で)
(2x2のフィルタをstride 2でフィルタしてるので元の半分になる)
今一何のためにやってるかわかりません。
データを圧縮するため?

   keep_prob = tf.placeholder(tf.float32)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

過学習を防ぐためにいくつかのニューロンの伝搬を止めるdropout層というのが挿入されてます

    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

    y_ = tf.placeholder(tf.float32, [None, 10])
    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

最後は数字のクラス分けをするために10の値で出力しています(Affine変換)

ちなみにこれでmnistを学習すると

step 11000, training accuracy 1
step 11100, training accuracy 1
step 11200, training accuracy 1
step 11300, training accuracy 0.99
step 11400, training accuracy 1
step 11500, training accuracy 1
step 11600, training accuracy 1
step 11700, training accuracy 1
step 11800, training accuracy 1
step 11900, training accuracy 1
step 12000, training accuracy 1
step 12100, training accuracy 0.99
step 12200, training accuracy 1

こんな感じで0.99を超えました。


試したコード
experiment2.py · GitHub