尝试调整TensorFlow的MNIST示例给出了NAN预测

时间:2016-08-23 14:11:52

标签: python machine-learning tensorflow

我正在玩TensorFlow,使用'MNIST for beginners'示例(initial code here)。我做了一些轻微的改编:

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选项),看起来两者都是list list的{​​{1}}个float

TensorFlow为什么不接受这个数组?它只是抱怨因为它认识到它无法从一堆随机数据中学到东西吗?我不指望,但我以前错了。

2 个答案:

答案 0 :(得分: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数值稳定性的机器学习堆栈交换文章,但你很快就能找到它们我确定。

答案 1 :(得分:0)

真实的MNIST数据包含非常稀疏的数据。大多数值都是零。您的合成数据是均匀分布的(请参阅numpy)。训练的W和b假设稀疏输入。您训练的模型有可能过度强调并且具有连接到特定输入像素的非常大的W权重以允许良好的输出概率(大的post-softmax值需要大的pre-softmax激活)。当您提供合成数据时,突然之间,所有输入幅度都比以前大得多,导致到处都有非常大的激活,可能导致溢出。