2016-05-12 42 views
2

TensorFlowを使用してフィードフォワードニューラルネットワークを使用して連続した実数値を出力したいと考えています。もちろん、私の入力値は連続した実数値でもあります。TensorFlowの損失関数(MSE)のNaN値

私はネットは2つの隠し層を有し、コスト関数としてMSEを使用したいので、私はこのようにそれを定義した:私は、バッチ訓練と私は評価するすべてのステップをやっている

def mse(logits, outputs): 
    mse = tf.reduce_mean(tf.pow(tf.sub(logits, outputs), 2.0)) 
    return mse 

def training(loss, learning_rate): 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate) 
    train_op = optimizer.minimize(loss) 
    return train_op 

def inference_two_hidden_layers(images, hidden1_units, hidden2_units): 
    with tf.name_scope('hidden1'): 
     weights = tf.Variable(tf.truncated_normal([WINDOW_SIZE, hidden1_units],stddev=1.0/math.sqrt(float(WINDOW_SIZE))),name='weights') 
     biases = tf.Variable(tf.zeros([hidden1_units]),name='biases') 
     hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases) 

    with tf.name_scope('hidden2'): 
     weights = tf.Variable(tf.truncated_normal([hidden1_units, hidden2_units],stddev=1.0/math.sqrt(float(hidden1_units))),name='weights') 
     biases = tf.Variable(tf.zeros([hidden2_units]),name='biases') 
     hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases) 

    with tf.name_scope('identity'): 
     weights = tf.Variable(tf.truncated_normal([hidden2_units, 1],stddev=1.0/math.sqrt(float(hidden2_units))),name='weights') 
     biases = tf.Variable(tf.zeros([1]),name='biases') 

     logits = tf.matmul(hidden2, weights) + biases 

    return logits 

train_opおよびloss演算子。

_, loss_value = sess.run([train_op, loss], feed_dict=feed_dict) 

問題は、損失関数を評価した結果、いくつかのNaN値が得られることです。私は次のようにただ1つの隠れ層でニューラルネットワークを使用する場合には発生しません:

def inference_one_hidden_layer(inputs, hidden1_units): 
    with tf.name_scope('hidden1'): 
     weights = tf.Variable(
    tf.truncated_normal([WINDOW_SIZE, hidden1_units],stddev=1.0/math.sqrt(float(WINDOW_SIZE))),name='weights') 
     biases = tf.Variable(tf.zeros([hidden1_units]),name='biases') 
     hidden1 = tf.nn.relu(tf.matmul(inputs, weights) + biases) 

    with tf.name_scope('identity'): 
     weights = tf.Variable(
    tf.truncated_normal([hidden1_units, NUM_CLASSES],stddev=1.0/math.sqrt(float(hidden1_units))),name='weights') 
     biases = tf.Variable(tf.zeros([NUM_CLASSES]),name='biases') 
     logits = tf.matmul(hidden1, weights) + biases 

    return logits 

ネット2つの隠れ層を使用するときに、なぜ私がNaN損失値を得るのですか?

答えて

3

あなたの学習率を気にしてください。ネットワークを拡張すると、学習するパラメータが増えます。つまり、学習率を下げる必要があります。

学習率が高い場合は、体重が爆発します。また、あなたの出力値が爆発するでしょう。