2016-07-23 84 views
2

我一直試圖在TensorFlow中的MNIST示例後面實現Logistic迴歸,但是使用CSV中的數據。每行是一個樣本,有12個維度。我的代碼如下:TensorFlow返回nan當實施Logistic迴歸

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 ...),但對於每次迭代後,它返回'南。

我試過的東西:我確信模型的每個組件方面都起作用。這個問題完全發生在第一次迭代之後。我已經學會了學習速度,但是這沒有任何作用。我嘗試將權重初始化爲truncated_normal(我不應該爲邏輯迴歸做任何工作),但這也沒有幫助。

那麼,有什麼想法?我花了大約3個小時試圖修復它,並且已經用完了想法。當TensorFlow去優化成本函數時,看起來似乎沒有什麼作用。

+0

謝謝你,立即奏效。如果你不介意解釋,tf.maximum(pred,1e-15)是做什麼的,爲什麼它能解決我遇到的問題? – Alex

+0

很高興工作。見下文! –

回答

3

您遇到的問題是因爲log(pred)未針對pred = 0定義。圍繞此操作的「hacky」方法是使用tf.maximum(pred, 1e-15)tf.clip_by_value(pred, 1e-15, 1.0)

但是,更好的解決方案是使用tf.nn.softmax_cross_entropy_with_logits(pred)而不是單獨應用softmax和交叉熵,它會自動處理像這樣的邊緣情況(因此所有問題)!

對於進一步的閱讀,我建議這個偉大的答案: https://stackoverflow.com/a/34243720/5829427