Tensorflow Cifar10教程示例丢失是nan

时间:2016-12-08 15:44:09

标签: python tensorflow

我目前正在尝试自学TensorFlow。经过彻底的阅读和视频,我试图重新创建以提供的示例 https://www.tensorflow.org/versions/r0.12/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners 然而,为了不仅复制和粘贴,我决定进行小的改动,实际上看我是否理解我在做什么,因此我决定使用CIFAR-10数据集(小的32x32 rgb图像)。

代码框架几乎是基本框架,就像它在教程中所示:

# Imports
import tensorflow as tf
import numpy as np

###
### Open data files (dict)
###

def unpickle(file):
    import cPickle
    fo = open(file, 'rb')
    dict = cPickle.load(fo)
    fo.close()
    return dict

cifar10_test = unpickle('cifar-10-batches-py/test_batch')
cifar10_meta = unpickle('cifar-10-batches-py/batches.meta')
cifar10_batches = [unpickle('cifar-10-batches-py/data_batch_1'),
    unpickle('cifar-10-batches-py/data_batch_2'),
    unpickle('cifar-10-batches-py/data_batch_3'),
    unpickle('cifar-10-batches-py/data_batch_4'),
    unpickle('cifar-10-batches-py/data_batch_5')]

###
### Tensorflow Model
###
x = tf.placeholder("float", [None, 3072]) 
W = tf.Variable(tf.zeros([3072,10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x,W) + b)
y_ = tf.placeholder("float", [None,10])

cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

###
### Model training
###

for batch in cifar10_batches:
    # Convert labels to vector with zeros, but 1 at correct position
    batch['labels_vec'] = np.zeros((10000,10), dtype=float, order='C')
    for i in range(10000):
        batch['labels_vec'][i][batch['labels'][i]] = 1

    # Train in smaller sub-batches
    for i in range(3): # Breaks at first iteration, so no need to go on further
        start = i*100
        stop = start+100
        [_, cross_entropy_py] = sess.run([train_step, cross_entropy],
            feed_dict={x: batch['data'][start:stop],
            y_: batch['labels_vec'][start:stop]})
        print 'loss = %s' % cross_entropy_py
    break # Only first batch for now

这让我得到了输出:

loss = 230.259
loss = nan
loss = nan

控制台未提供错误。我尝试搜索具有相同问题的人,但是只发现了导致“纳”值的情景的不同问题。

我从在线教程中改变的唯一内容:最初使用的数据集在灰度上有28x28像素的手写数字,因此只有784个值,而不是3072.但是,我认为这不应该从根本上改变很多,因为我也改变了占位符的维度。

此外,我的标签值是0到9之间的数字列表。我将其更改为零向量,其中正确的位置用1表示。 例如如果它是3,它将被替换为[0 0 0 1 0 0 0 0 0 0]

关于我应该将调试作为目标的一些提示会很有帮助。对于GradientDescentOptimizer,我有一个更大的0.1的步长,但是在读取太大的步长可能导致损失扩散到nan之后,将其减少到0.01(教程中使用的原始值)。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的损失在数值上并不稳定。您可以使用已经为多类逻辑回归实现的损失而不是损失:sigmoid_cross_entropy_with_logits。它经过精心设计,以避免数字问题。