2017-01-12 7 views
0
import tensorflow as tf 

x = tf.placeholder(tf.float32, [None, 1]) 
y = tf.placeholder(tf.float32, [None, 1]) 

w = tf.Variable(tf.zeros([1, 1], tf.float32)) 
# b = tf.Variable(tf.random_uniform([1, 1], -1, 1)) 
hypothesis = tf.nn.softmax(tf.matmul(x, w)) 
cost = tf.reduce_mean(-tf.reduce_sum(hypothesis* tf.log(y), reduction_indices=[1])) 
train = tf.train.GradientDescentOptimizer(0.001).minimize(cost) 
init = tf.initialize_all_variables() 

with tf.Session() as sess: 
    sess.run(init) 
    for i in range(5000): 
     #print (sess.run(w)) 
     sess.run(train, feed_dict={x:x_, y:y_}) 
    print (sess.run(w)) 

Мой исходный код такой же, как указано выше Я не могу понять, почему результатом является NAN.
Я начинаю в этом тензорном потоке и области машинного обучения.
Я думаю, что мой исходный код правильный. Пожалуйста, скажите мне, если они ошибаются.Почему тензорный поток дает nan вместо номера

ответ

0

Без видения ваших значений x_, это трудно понять наверняка. Но образованная догадка - это tf.log. Вы используете полученные нулевые или отрицательные входы. Таким образом, вместо

cost = tf.reduce_mean(-tf.reduce_sum(hypothesis* tf.log(y), reduction_indices=[1])) 

Попробуйте что-то вроде

cost = tf.reduce_mean(-tf.reduce_sum(hypothesis* tf.log(tf.clip_by_value(y, 1e-8, 1.0)), reduction_indices=[1])) 

Также стоит отметить, что в версии 1.0.0-альфа TensorFlow имеет специализированный отладчик, который помогает диагностирование такого рода проблемы, среди других. См.: https://www.tensorflow.org/versions/master/how_tos/debugger/

Чтобы попробовать, после вашей линии sess.run(init) добавить.

from tensorflow.python import debug as tf_debug 
sess = tf_debug.LocalCLIDebugWrapperSession(sess) 
sess.add_tensor_filter("has_inf_or_nan", tf_debug.has_inf_or_nan) 

В интерфейсе командной строки, которая показывает на следующем sess.run вызова.

tfdbg> run -f has_inf_or_nan 
0

Похоже, вы пытаетесь создать простую логистическую регрессию, но переменные все перемешаны.

Во-первых, крест энтропия должна быть:

y*tf.log(hypothesis) 

не наоборот. Во-вторых, y должен быть выбран из ваших меток данных - то, что вы не делаете. x_ и y_ отсутствуют. Трудно отлаживать, не исправляя все эти два вопроса.

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