1

你好tensorflow簡單迴歸

我只是想嘗試用簡單的邏輯regression.I've二元分類有未標記的輸出數據爲{1,0} //(他/她通過考試與否) 成本函數返回(NaN)。什麼是錯的?

learning_rate = 0.05 
total_iterator = 1500 
display_per = 100 

data = numpy.loadtxt("ex2data1.txt",dtype=numpy.float32,delimiter=","); 

training_X = numpy.asarray(data[:,[0,1]]) # 100 x 2 

training_X包含100×2矩陣作爲考scores.eg [98.771 4.817]

training_Y = numpy.asarray(data[:,[2]],dtype=numpy.int) # 100 x 1 

training_Y包含100X1陣列,[1] [0] [0] [1] 我可以不寫一行行由於計算器格式

m = data.shape[0] 

x_i = tf.placeholder(tf.float32,[None,2]) # None x 2       
y_i = tf.placeholder(tf.float32,[None,1]) # None x 1      

W = tf.Variable(tf.zeros([2,1])) # 2 x 1 
b = tf.Variable(tf.zeros([1])) # 1 x 1 

h = tf.nn.softmax(tf.matmul(x_i,W)+b) 

cost = tf.reduce_sum(tf.add(tf.multiply(y_i,tf.log(h)),tf.multiply(1- 
y_i,tf.log(1-h))))/-m 

我試圖用簡單的物流成本function.it得到了恢復「NaN'.i以爲我的成本函數是完全garbarage,讓我們ed tensorflow的例子的成本函數:

cost = tf.reduce_mean(-tf.reduce_sum(y_i*tf.log(h), reduction_indices=1)) 

但它沒有奏效。

initializer= tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 

init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    sess.run(init) 

    print("cost: ", sess.run(cost, feed_dict={x_i:training_X, 
    y_i:training_Y}), "w: ", sess.run(W),"b: ", sess.run(b)) 
+0

請問「我的標籤輸出數據爲{1,0}」是什麼意思? – tagoma

+0

它沒有一個熱解碼。只是一個二進制。 –

回答

2

功能tf.nn.softmax預計logits的(最後一維)的數量相等的類的數量(2你的情況{1,0})。因爲你的情況中的最後一個維度是1,所以softmax將總是返回1(因爲沒有其他類存在,所以在唯一可用類中的概率總是爲1)。因此h是一個用1填充的張量,並且tf.log(1-h)將返回負無窮。無窮大乘以零(某些行中的1-y_i)將返回NaN。

您應該用tf.nn.sigmoid替換tf.nn.softmax

一個可能的解決方法是:

h = tf.nn.sigmoid(tf.matmul(x_i,W)+b) 
cost = tf.reduce_sum(tf.add(tf.multiply(y_i,tf.log(h)),tf.multiply(1- 
y_i,tf.log(1-h))))/-m 

或更好,你可以在這種情況下使用tf.sigmoid_cross_entropy_with_logits
,它應該做如下:

h = tf.matmul(x_i,W)+b 
cost = tf.reduce_mean(tf.sigmoid_cross_entropy_with_logits(labels=y_i, logits=h)) 

這個功能比數值上更穩定使用tf.nn.sigmoid後跟cross_entropy函數,如果tf.nn.sigmoid由於float32的不精確性而變得接近0或1,則該函數可以返回NaN。

+0

謝謝!它已經被你解決了,我希望這個答案能夠幫助那些遇到同樣問題的人。 –