2

我目前正在從事Coursera修復Professor Andrew Ng的「機器學習」課程任務,並且我陷入了Logistic迴歸部分。爲什麼我的GradientDescentOptimizer會生成NaN?

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 

第一個結果的成本函數是正確的,但未來的人都應該是:

3.0133 
1.5207 
0.7336 

,而是我得到一個一羣NaN的。我嘗試了較低的學習率,都無濟於事。我究竟做錯了什麼?是否有可能在TensorFlow中重現此作業?

PS:其他python解決方案似乎使用scipy.optimize,但我不知道如何使用TensorFlow值,我想只使用TensorFlow(如果可能)。

編輯:我也試圖把偏見作爲tf.ones而不是tf.zeros,但它也沒有工作。

回答

0

您的對數不會消毒輸入。很可能會發生這樣的情況:您的輸入值爲負數,很快就會導致浮點數運算。

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

  • 檢查NaN或無限與假定爲零
  • 輸出。如果負輸入,剪輯輸出到一些靜態數例如。日誌(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); 
    } 
    }