Я играю с TensorFlow, используя пример «MNIST для начинающих» (initial code here). Я сделал некоторые незначительные Адаптации:Попытка адаптировать пример MNIST от TensorFlow дает прогнозы 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}))
В частности, я только работаю послдоватльность Training 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]]
Который, как представляется, вероятность ТФ назначая каждый из возможностей (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