我目前正在努力教自己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控制台没有提供错误。我试着寻找有同样问题的人,但是只发现了不同的场景问题,这些问题导致了"nan“值。
我从在线教程中唯一改变的地方是:最初使用的dataset有手写数字,灰度为28x28像素,因此只有784个值,而不是3072个。然而,我认为这不应该从根本上改变很多,因为我也改变了占位符的维度。
此外,我的标号值是0到9之间的数字列表。我将它改为零向量,其中正确的位置用1表示。例如,如果它是3,它将被替换为0 0 0 1 0 0 0。
一些提示,我应该把我的调试目标将是有帮助的。对于GradientDescentOptimizer,我的步长更大,为0.1,但在阅读过大的步长后,将其降到了0.01 (本教程中使用的原始值),这可能会导致向nan的丢失。
提前谢谢你。
发布于 2016-12-08 15:51:45
你的损失在数字上不稳定。您可以使用已经为多类逻辑回归实现的损失,而不是损失:逻辑。它是精心设计的,以避免数值问题。
https://stackoverflow.com/questions/41043338
复制相似问题