我一直试图在TensorFlow中实现逻辑回归,遵循MNIST示例,但使用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 one hot numpy阵列。
问题是:在第一次迭代中计算成本c(值为0.6931…),但在之后的每次迭代中,它都返回“nan”
我尝试过的事情:我确保模型的每个组件都工作正常。这个问题完全发生在第一次迭代之后。我一直在玩弄学习率,但那没什么用。我尝试过将权重初始化为截断的_normal(无论如何,对于logistic回归我不需要这样做),但这也没有帮助。
有什么想法吗?我花了大约3个小时试图修好它,但已经没有什么想法了。当TensorFlow去优化成本函数时,似乎有些东西不起作用。
最佳答案
您遇到的问题是,没有为pred=0定义日志(pred)。解决这个问题的“黑客”方法是使用tf.maximum(pred, 1e-15)
或tf.clip_by_value(pred, 1e-15, 1.0)
。
然而,一个更好的解决方案是使用tf.nn.softmax_cross_entropy_with_logits(pred)
而不是分别应用softmax和cross-entropy,这将自动处理这样的边缘情况(因此所有问题)!
为了进一步阅读,我推荐这个好答案:
https://stackoverflow.com/a/34243720/5829427
关于python - 实现逻辑回归时TensorFlow返回nan,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38538635/