为什么我的GradientDescentOptimizer会产生NaN?

2024-03-28 16:57:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在研究Coursera Andrew Ng教授的“机器学习”课程作业,我陷入了逻辑回归部分。在

filename = 'data/ex2data1.txt'
data = np.loadtxt(filename, delimiter = ",", unpack = True)

# Data matrices
xtr = np.transpose(np.array(data[:-1]))
ytr = np.transpose(np.array(data[-1:]))

# Initial weights
W = tf.Variable(tf.zeros([2,1], dtype = tf.float64))

# Bias
b = tf.Variable(tf.zeros([1], dtype = tf.float64))

# Cost function
y_ = tf.nn.sigmoid(tf.matmul(xtr,W) + b)

cost = -tf.reduce_mean(ytr*tf.log(y_) + (1-ytr)*tf.log(1-y_))
optimize = tf.train.GradientDescentOptimizer(0.01).minimize(cost)

corr = tf.equal(tf.argmax(ytr,1), tf.argmax(y_,1))
acc = tf.reduce_mean(tf.cast(corr, tf.float64))

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(cost))
    for _ in range(3):
        sess.run(optimize)
        print(sess.run(cost))

答案如下:

^{pr2}$

成本函数的第一个结果是正确的,但下一个结果应该是:

3.0133
1.5207
0.7336

相反,我得到了一堆NaN's。我试着降低学习率,但都没用。我做错什么了?有没有可能在TensorFlow中重现这个赋值?在

PS:其他python解决方案似乎正在使用scipy.optimize公司但我不知道如何将其与TensorFlow值一起使用,我希望尽可能只使用TensorFlow。在

编辑:我也试过把偏见tf.ones公司而不是tf.0,但也没用。在


Tags: rundatatftensorflownpfilenamearrayvariable
1条回答
网友
1楼 · 发布于 2024-03-28 16:57:53

你的对数并没有净化输入。很有可能的情况是,您的输入值为负数,而这些值很快就不是任何浮点数算术。在

What I did in Java code that makes heavy use of logs in similar domain:

  • 检查NaN或无穷大,并假设输出为零
  • 如果输入为负,则将输出剪辑为某个静态数字,例如log(1e-5)~=-11.51
  • 否则就拿原木

在Java中,代码看起来像这样,应该不难翻译成tf:

public static double guardedLogarithm(double input) {
    if (Double.isNaN(input) || Double.isInfinite(input)) {
      return 0d;
    } else if (input <= 0d || input <= -0d) {
      // assume a quite low value of log(1e-5) ~= -11.51
      return -10d;
    } else {
      return FastMath.log(input);
    }
  }

相关问题 更多 >