Python 实施逻辑回归时的TensorFlow返回nan

Python 实施逻辑回归时的TensorFlow返回nan,python,numpy,tensorflow,logistic-regression,Python,Numpy,Tensorflow,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])) mu

我一直在尝试按照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”

我尝试过的事情:我确保模型的每个组件方面都正常工作。问题完全发生在第一次迭代之后。我一直在考虑学习率,但这没什么用。我尝试过将权重初始化为截断的_-normal(无论如何,对于逻辑回归,我不需要这样做),但这也没有帮助


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

您遇到的问题是因为没有为pred=0定义log(pred)。解决这个问题的“黑客”方法是使用
tf.maximum(pred,1e-15)
tf.clip\u by\u value(pred,1e-15,1.0)

然而,一个更好的解决方案是使用
tf.nn.softmax\u cross\u entropy\u和\u logits(pred)
而不是单独应用softmax和cross entropy,这会自动处理这样的边缘情况(因此所有问题)

为了进一步阅读,我推荐这个很棒的答案:

谢谢,这很快就奏效了。如果你不介意解释的话,tf.maximum(pred,1e-15)是做什么的,为什么它能解决我遇到的问题?很高兴它成功了。看下面!