【问题标题】:TensorFlow Returning nan When Implementing Logistic RegressionTensorFlow在实现逻辑回归时返回nan
【发布时间】:2016-07-23 05:49:57
【问题描述】:

我一直在尝试按照 MNIST 示例在 TensorFlow 中实现逻辑回归,但使用来自 CSV 的数据。每行是一个样本,有 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...),但之后的每次迭代,它都返回 'nan'。

我尝试过的事情:我确保模型的每个组成部分都正常工作。该问题完全发生在第一次迭代之后。我玩过学习率,但这无济于事。我已经尝试将权重初始化为 truncated_normal (无论如何我都不应该为逻辑回归做这件事),但这也无济于事。

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

【问题讨论】:

  • 谢谢,这立即奏效了。如果您不介意解释, tf.maximum(pred,1e-15) 有什么作用,为什么它可以解决我遇到的问题?
  • 很高兴它成功了。见下文!

标签: python numpy tensorflow logistic-regression


【解决方案1】:

您遇到的问题是因为未为 pred = 0 定义 log(pred)。解决此问题的“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://*.com/a/34243720/5829427

【讨论】: