我在玩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.images
和np.random.rand
選項),它看起來像是list
的list
s的float
s。
爲什麼TensorFlow不接受這個數組?這是否只是抱怨,因爲它認識到無法從一堆隨機數據中學習?我不期望,但我以前錯了。
'np.random.rand'產生範圍爲[[0,1]'的數字。你從'mnist.train.images'得到的數字範圍是多少?一些中間值很可能溢出或下溢。我會嘗試打印出中間值,比如說'tf.matmul(x,W)'的結果,看看這是不是問題。 – keveman
'0.5'因爲學習速度也很大,所以試試'0.01'或更少 – fabrizioM
@keveman'mnist.train.images [0]'是一個大部分爲0的數組,大部分都在0-1範圍內。在嘗試將「matmul」分解爲中間計算時,我將訓練步數改爲2 ...並突然發揮作用,給出預期的〜10%的準確度。我已經將它隔離到修正它的那個變化上,這似乎確認了上/下溢。想想可能在哪裏,或者我可以如何解決它? – Undo