TensorFlow在实施Logistic回归时返回nan

时间:2016-07-23 05:49:57

标签: python numpy tensorflow logistic-regression

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

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 ...),但是对于之后的每次迭代,它都会返回&#39; nan。&#39; < / p>

我尝试过的事情:我确保模型的每个组件方面都有效。问题完全发生在第一次迭代之后。我已经学会了学习率,但这并没有做任何事情。我已经尝试将权重初始化为truncated_normal(我无论如何都不需要进行逻辑回归),但这也无济于事。

那么,有什么想法吗?我花了大约3个小时试图解决它并且已经没有想法了。当TensorFlow优化成本函数时,似乎某些东西不起作用。

1 个答案:

答案 0 :(得分:4)

你遇到的问题是因为没有为pred = 0定义log(pred)。&#34; hacky&#34;解决这个问题的方法是使用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