2016-07-23 87 views
2

我一直试图在TensorFlow中的MNIST示例后面实现Logistic回归,但是使用CSV中的数据。每行是一个样本,有12个维度。我的代码如下:TensorFlow返回nan当实施Logistic回归

batch_size = 5 
learning_rate = .001 
x = tf.placeholder(tf.float32,[None,12]) 
y = tf.placeholder(tf.float32,[None,2]) 
W = tf.Variable(tf.zeros([12,2])) 
b = tf.Variable(tf.zeros([2])) 
mult = tf.matmul(x,W) 
pred = tf.nn.softmax(mult+b) 
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1)) 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 

sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 
avg_cost = 0 
total_batch = int(len(Xtrain)/batch_size) 
for i in range(total_batch): 
    batch_xs = Xtrain[i*batch_size:batch_size*i+batch_size] 
    batch_ys = ytrain[i*batch_size:batch_size*i+batch_size] 
    _, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,y: batch_ys}) 
    print(c) 

Xtrain是252x10 numpy的阵列,并且ytrain是252X2一个热numpy的阵列。

问题:成本C计算为第一次迭代(值为0.6931 ...),但对于每次迭代后,它返回'南。

我试过的东西:我确信模型的每个组件方面都起作用。这个问题完全发生在第一次迭代之后。我已经学会了学习速度,但是这没有任何作用。我尝试将权重初始化为truncated_normal(我不应该为逻辑回归做任何工作),但这也没有帮助。

那么,有什么想法?我花了大约3个小时试图修复它,并且已经用完了想法。当TensorFlow去优化成本函数时,看起来似乎没有什么作用。

+0

谢谢你,立即奏效。如果你不介意解释,tf.maximum(pred,1e-15)是做什么的,为什么它能解决我遇到的问题? – Alex

+0

很高兴工作。见下文! –

回答

3

您遇到的问题是因为log(pred)未针对pred = 0定义。围绕此操作的“hacky”方法是使用tf.maximum(pred, 1e-15)tf.clip_by_value(pred, 1e-15, 1.0)

但是,更好的解决方案是使用tf.nn.softmax_cross_entropy_with_logits(pred)而不是单独应用softmax和交叉熵,它会自动处理像这样的边缘情况(因此所有问题)!

对于进一步的阅读,我建议这个伟大的答案: https://stackoverflow.com/a/34243720/5829427