TensorFlow 在执行逻辑回归时返回 nan
TensorFlow Returning nan When Implementing Logistic Regression
我一直在尝试按照 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...),但对于之后的每次迭代,它 returns 'nan.'
我尝试过的事情: 我确保模型的每个组成部分都正常工作。这个问题完全发生在第一次迭代之后。我玩过学习率,但这没有任何作用。我已经尝试将权重初始化为 truncated_normal(无论如何我不需要为逻辑回归做这件事),但这也无济于事。
那么,有什么想法吗?我花了大约 3 个小时试图修复它并且 运行 没有想法。当 TensorFlow 去优化成本函数时,似乎有些东西不起作用。
您遇到的问题是因为没有为 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 和交叉熵,它会自动处理像这样的边缘情况(因此您的所有问题)!
为了进一步阅读,我推荐这个很棒的答案:
我一直在尝试按照 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...),但对于之后的每次迭代,它 returns 'nan.'
我尝试过的事情: 我确保模型的每个组成部分都正常工作。这个问题完全发生在第一次迭代之后。我玩过学习率,但这没有任何作用。我已经尝试将权重初始化为 truncated_normal(无论如何我不需要为逻辑回归做这件事),但这也无济于事。
那么,有什么想法吗?我花了大约 3 个小时试图修复它并且 运行 没有想法。当 TensorFlow 去优化成本函数时,似乎有些东西不起作用。
您遇到的问题是因为没有为 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 和交叉熵,它会自动处理像这样的边缘情况(因此您的所有问题)!
为了进一步阅读,我推荐这个很棒的答案: