2016-05-12 4 views
2

Я хотел бы использовать Нейронную сеть Feedforward для вывода непрерывного действительного значения с помощью TensorFlow. Значения моих входов, конечно же, также являются непрерывными реальными значениями.Значения NaN для функции потерь (MSE) в TensorFlow

Я хочу, чтобы моя сетка имеет два скрытых слоев и использовать 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_value = sess.run([train_op, loss], feed_dict=feed_dict) 

Проблема в том, что я получаю некоторые значения NaN в результате оценки функции потерь. Это не произойдет, если я просто использовать нейронную сеть только с одним скрытым слоем, как следующее:

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 

Почему я получаю значение потерь NaN при использовании двух скрытых слоев чистых?

ответ

3

Обратите внимание на скорость обучения. Если вы расширите свою сеть, у вас будет больше параметров для изучения. Это означает, что вам также необходимо уменьшить скорость обучения.

Для высокой скорости обучения ваши веса взорвутся. Тогда ваши выходные значения будут взрываться.

Смежные вопросы