簡體   English   中英

為什么我的GradientDescentOptimizer產生NaN?

[英]Why does my GradientDescentOptimizer produce NaN?

我目前正在重做Coursera的Andrew Ng教授的“機器學習”課程作業,而我陷入了Logistic回歸部分。

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))

這產生了答案:

0.69314718056
nan
nan
nan

cost函數的第一個結果是正確的,但接下來的結果應該是:

3.0133
1.5207
0.7336

相反,我得到了一堆NaN。 我曾嘗試過降低學習率,但無濟於事。 我究竟做錯了什么? 是否可以在TensorFlow中重現此分配?

PS:其他python解決方案似乎正在使用scipy.optimize,但我不知道如何將其與TensorFlow值一起使用,並且如果可能的話,我只想使用TensorFlow。

編輯:我也嘗試過將偏差作為tf.ones而不是tf.zeros,但它也沒有用。

您的對數沒有清除輸入。 負輸入值很可能會迅速使任何浮點數運算不正確。

我在Java代碼中做了很多工作,這些代碼大量使用了類似域中的日志:

  • 檢查NaN或Infinity並假定輸出為零
  • 如果輸入為負,則將輸出裁剪為某個靜態數字,例如。 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);
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM