2016-06-20 24 views
0

我是Tensorflow的新手,我經歷了有關MNIST(https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html)的初學者教程。 它可以很好地處理給定的數據,但當我嘗試使用自己的數據時會失敗。 這裏就是我試圖使網絡學習加法(I,J)實現的例子 - >(I + J):未能在初學者教程中使用自定義數據

def generateData(n, r=100) : 
    inputData = [] 
    outputData = [] 
    for k in range(n): 
     i, j = random.randrange(0, r), random.randrange(0, r) 
     inputData.append([i, j]) 
     outputData.append([i + j]) 
    return inputData, outputData 

x = tf.placeholder(tf.float32, [None, 2]) 
W = tf.Variable(tf.zeros([2, 1])) 
b = tf.Variable(tf.zeros([1])) 
y = tf.nn.softmax(tf.matmul(x, W) + b) 
y_ = tf.placeholder(tf.float32, [None, 1]) 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 
for i in range(10): 
    batch_xs, batch_ys = generateData(10) 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
batch_xs, batch_ys = generateData(10) 
print(sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys})) 
feed_dict = {x: batch_xs} 
classification = sess.run(y, feed_dict) 
print(classification) 

其結果是,我得到1.0準確性和向量[1.0]進行分類。 100%的準確性是可能的,因爲模型非常簡單,但預測顯然不是。事實上,如果我用隨機數替換生成的輸出數據i + j,我會得到完全相同的結果。在這種情況下,我不可能有1.0的準確性。 這就好像網絡沒有學到任何東西。 問題在哪裏?

回答

1

您正在有效地嘗試進行線性迴歸,但您正在使用面向分類*的交叉熵損失。嘗試使用不同的損失函數,例如squared_loss = tf.reduce_mean(tf.squared_distance(y, y_))

*此外,您正在以錯誤的方式使用交叉熵損失。如果你想用交叉熵損失進行分類,你需要爲每一類分類問題輸出一個神經元。在上面的代碼片段中,您只有一個輸出神經元(y的形狀爲[None, 1]),但是200個假設的類如果y是0到100範圍內的兩個整數的總和。要清楚的是,這個特殊問題應該是不是被視爲分類問題。我只是想在你提供的代碼中指出這個錯誤。