2016-08-23 6 views
1

Я играю с 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 не принимает этот массив? Это просто жалуется, потому что признает, что он не может научиться из кучи случайных данных? Я бы не ожидал, но раньше я ошибся.

+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, связанные с определенными входными пикселями, чтобы обеспечить хорошие вероятности вывода (большое значение post-softmax требует большой активации pre-softmax). Когда вы кормите свои синтетические данные, внезапно все входные величины намного больше, чем раньше, что приводит к очень большим активациям повсюду, что может привести к переполнению.

+0

Это помогает с точностью, но в моем тестировании это не устранило проблему 'nan'. – Undo

+0

См. Исправленный ответ. – ahaque

+0

Имеет смысл, хотя это происходит на недавно обученной модели (обученной случайными данными) – Undo

1

Что такое беспорядок, так это то, что журнал (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 численной устойчивости, но вы можете найти их довольно быстро, я уверен.

Смежные вопросы