2016-08-23 40 views
1

我在玩TensorFlow,使用'MNIST for beginners'示例(initial code here)。我做了一些輕微的adaptions:試圖適應TensorFlow的MNIST示例給出NAN預測

mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) 

sess = tf.InteractiveSession() 

# Create the model 
x = tf.placeholder(tf.float32, [None, 784]) 
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 
y = tf.nn.softmax(tf.matmul(x, W) + b) 

# Define loss and optimizer 
y_ = tf.placeholder(tf.float32, [None, 10]) 
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) 

fake_images = mnist.train.images.tolist() 

# Train 
tf.initialize_all_variables().run() 
for i in range(10): 
    batch_xs, batch_ys = fake_images, mnist.train.labels 
    train_step.run({x: batch_xs, y_: batch_ys}) 

# Test trained model 
print(y.eval({x: mnist.test.images})) 

具體來說,我只跑訓練步驟10次(我不關心的準確性,更多的速度)。我也一次在所有的數據上運行它(爲了簡單起見)。最後,我輸出TF正在做出的預測,而不是準確率。這裏的(一些)上面的代碼的輸出:

[ 1.08577311e-02 7.29394853e-01 5.02395593e-02 ..., 2.74689011e-02 
    4.43389975e-02 2.32385024e-02] 
..., 
[ 2.95746652e-03 1.30554764e-02 1.39354384e-02 ..., 9.16484520e-02 
    9.70732421e-02 2.57733971e-01] 
[ 5.94450533e-02 1.36338845e-01 5.22132218e-02 ..., 6.91468120e-02 
    1.95634082e-01 4.83607128e-02] 
[ 4.46179360e-02 6.66685810e-04 3.84704918e-02 ..., 6.51754031e-04 
    2.46591796e-03 3.10819712e-03]] 

這似乎是概率TF被分配給每一個的可能性(0-9)。一切都與世界一致。

我的主要目標是適應另一個用途,但首先我想確保我可以給它其他數據。這是我已經試過:

fake_images = np.random.rand(55000, 784).astype('float32').tolist() 

其中,按照我的理解,應該產生隨機垃圾的陣列,其結構與從MNIST數據。但做出以上更改,這裏是我得到的:

[[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
..., 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan]] 

這顯然沒那麼有用。查看每個選項(mnist.train.imagesnp.random.rand選項),它看起來像是listlist s的float s。

爲什麼TensorFlow不接受這個數組?這是否只是抱怨,因爲它認識到無法從一堆隨機數據中學習?我不期望,但我以前錯了。

+0

'np.random.rand'產生範圍爲[[0,1]'的數字。你從'mnist.train.images'得到的數字範圍是多少?一些中間值很可能溢出或下溢。我會嘗試打印出中間值,比如說'tf.matmul(x,W)'的結果,看看這是不是問題。 – keveman

+0

'0.5'因爲學習速度也很大,所以試試'0.01'或更少 – fabrizioM

+0

@keveman'mnist.train.images [0]'是一個大部分爲0的數組,大部分都在0-1範圍內。在嘗試將「matmul」分解爲中間計算時,我將訓練步數改爲2 ...並突然發揮作用,給出預期的〜10%的準確度。我已經將它隔離到修正它的那個變化上,這似乎確認了上/下溢。想想可能在哪裏,或者我可以如何解決它? – Undo

回答

0

真實的MNIST數據包含非常稀疏的數據。大部分值爲零。您的合成數據均勻分佈(請參見numpy)。 W和b訓練假設稀疏輸入。您可能訓練的模型能夠強烈過度擬合,並且具有連接到特定輸入像素的非常大的W權重,以實現良好的輸出概率(大型後softmax值需要大的pre-softmax激活)。當您輸入合成數據時,突然間,所有輸入量值都比以前大得多,導致無處不在的非常大的激活,可能導致溢出。

+0

這有助於提高準確性,但在我的測試中,它並未解決'nan'問題。 – Undo

+0

查看修訂後的答案。 – ahaque

+0

有意義,雖然這發生在一個新鮮訓練的模型上(用隨機數據訓練) – Undo

1

什麼是你搞砸的是log(softmax)在數值上不穩定。

The softmax cross entropy with logits loss數值穩定。

所以,你可以做

activations = tf.matmul(x, W) + b 
loss = tf.nn.softmax_cross_entropy_with_logits(activations, y) 

# only to get predictions, for accuracy or you know, actual forward use of the model 
predictions = tf.nn.softmax(activations) 

我偷懶找對數SOFTMAX數值穩定性機器學習棧交流的文章,但你能很快我敢肯定,找到他們。