首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tensorflow Cifar10教程示例丢失是nan

Tensorflow Cifar10教程示例丢失是nan
EN

Stack Overflow用户
提问于 2016-12-08 15:44:09
回答 1查看 823关注 0票数 0

我目前正在努力教自己TensorFlow。在彻底阅读和视频之后,我尝试重新创建https://www.tensorflow.org/versions/r0.12/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners提供的示例,但是,为了不仅复制和粘贴,我决定做一些小的修改,看看我是否理解我在做什么,因此我决定使用CIFAR-10数据集(小的32x32 rgb图像)。

代码框架基本上是基本框架,如本教程所示:

代码语言:javascript
复制
# 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

这就给我留下了输出:

代码语言:javascript
复制
loss = 230.259
loss = nan
loss = nan

控制台没有提供错误。我试着寻找有同样问题的人,但是只发现了不同的场景问题,这些问题导致了"nan“值。

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

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

一些提示,我应该把我的调试目标将是有帮助的。对于GradientDescentOptimizer,我的步长更大,为0.1,但在阅读过大的步长后,将其降到了0.01 (本教程中使用的原始值),这可能会导致向nan的丢失。

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-08 15:51:45

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41043338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档