2016-08-26 4 views
3

26700回の反復後にトレーニングの精度が1から0.06に突然低下します。このコードはテンソルフローのオンラインドキュメントから入手したもので、フィルタサイズを5x5から3x3に、繰り返しを20000から100000に、バッチサイズを50から100に単純に変更しました。 AdamOptimizerに関連している可能性があります.GradientDesentOptimizerに変更すると、56200回の繰り返しでも発生しないためです。しかし、わかりません。 GradientDesentOptimizerにもこの問題があります。テンソルフローCNN mnist例の訓練の精度は、大規模な反復で予想外に0.06から1に低下します。

step 26400, training accuracy 1, loss 0.00202696 
step 26500, training accuracy 1, loss 0.0750173 
step 26600, training accuracy 1, loss 0.0790716 
step 26700, training accuracy 1, loss 0.0136688 
step 26800, training accuracy 0.06, loss nan 
step 26900, training accuracy 0.03, loss nan 
step 27000, training accuracy 0.12, loss nan 
step 27100, training accuracy 0.08, loss nan 

のpythonコード:

import tensorflow as tf 
from tensorflow.examples.tutorials.mnist import input_data 

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

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

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') 


mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 
print("Download Done!") 

sess = tf.InteractiveSession() 

# paras 
W_conv1 = weight_varible([3, 3, 1, 32]) 
b_conv1 = bias_variable([32]) 

# conv layer-1 
x = tf.placeholder(tf.float32, [None, 784]) 
x_image = tf.reshape(x, [-1, 28, 28, 1]) 

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

# conv layer-2 
W_conv2 = weight_varible([3, 3, 32, 64]) 
b_conv2 = bias_variable([64]) 

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

# full connection 
W_fc1 = weight_varible([7 * 7 * 64, 1204]) 
b_fc1 = bias_variable([1204]) 

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) 

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

# output layer: softmax 
W_fc2 = weight_varible([1204, 10]) 
b_fc2 = bias_variable([10]) 

y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) 
y_ = tf.placeholder(tf.float32, [None, 10]) 

# model training 
cross_entropy = -tf.reduce_sum(y_ * tf.log(y_conv)) 
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 

correct_prediction = tf.equal(tf.arg_max(y_conv, 1), tf.arg_max(y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

saver = tf.train.Saver() 
sess.run(tf.initialize_all_variables()) 
for i in range(100000): 
    batch = mnist.train.next_batch(100) 

    if i % 10 == 0: 
     train_accuacy = accuracy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0}) 
     train_cross_entropy = cross_entropy.eval(feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0}) 
     print("step %d, training accuracy %g, loss %g"%(i, train_accuacy, train_cross_entropy)) 
    train_step.run(feed_dict = {x: batch[0], y_: batch[1], keep_prob: 0.5}) 

# accuacy on test 
save_path = saver.save(sess, "./mnist.model") 
#saver.restore(sess,"./mnist.model") 
print("Model saved in file: %s" % save_path) 
print("test accuracy %g"%(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))) 

答えて

3

私は実際にちょうど私がそれがNaNのすべての最適化にポイントの後に場所を考え訓練されたCNNで、この問題に遭遇しました。私が考えているのは、コスト関数のログに数値的な安定性の問題があることです。ネットワークが高い確信度で予測を開始すると(この問題は、ネットワークが訓練され、より低いコストを達成する可能性が高いことを意味する)、y_convベクトルはy_conv = [1, 0](バッチングを無視する)のように見えます。これは、log(y_conv) = log([1, 0]) = [0, -inf]のログを意味します。 0,0と無限を乗算する方法がわからないので、y_ * tf.log(y_conv)を実行しているときに[1、0]も正しいとします。[1, 0] * [0, -inf] = [0, nan]を実行しています。これらのコストを追加すると、コストがかかります。私はy_ * tf.log(y_conv + 1e-5)のようなログに小さなエピソードを追加することでこれを修正できると思います。私は数字の問題の世話をしているようだtf.nn.sparse_softmax_cross_entropy_with_logits(...)を使用して私の問題を修正したようです。

+0

thx。 1.softmax_cross_entropy_with_logits()はうまくいきます。 50000回の反復後、私は99.3%のテスト精度を得ました。テストセットの精度を計算する際に非常にメモリがかかります(約5GB)ことを通知します。 – lariven

関連する問題