私は現在自分自身にTensorFlowを教えようとしています。徹底的な読書とビデオの後に、私は https://www.tensorflow.org/versions/r0.12/tutorials/mnist/beginners/index.html#mnist-for-ml-beginners で提供されている例に再作成しようとしましたが、コピーを&だけコピーするのではなく、実際に私が行っていることを理解するかどうかを確認するため、 CIFAR-10データセット(小さな32x32 rgbイメージ)で作業します。Tensorflow Cifar10チュートリアル例の損失はナノです
# 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ピクセルの手書き番号だったため、3072ではなく784個の値しかありませんでした。プレースホルダの寸法を変更しました。
さらに、私のラベル値は0と9の間の数字のリストとして与えられました。これをゼロベクトルに変更しました。正しい位置は1で示されます。 それが3であれば、[0 0 0 1 0 0 0 0 0]
に置き換えられます。デバッグを目的とするべきところにヒントがあります。私はGradientDescentOptimizerの0.1より大きいステップサイズを持っていましたが、大きすぎるステップサイズがナノに発散する可能性があることを読んだ後、0.01(チュートリアルで使用した元の値)に減らしました。
ありがとうございます。
ありがとうございます。「sigmoid_cross_entropy_with_logits」に変更すると、実際にnanが削除されました。しかし、私は 'tf.nn.sigmoid_cross_entropy_with_logits(y、y_)'を使用して入力を確信していましたが、損失はスカラーではなく行列になります。あれは正しいですか? – Michel
クロスエントロピーの周りにtf.reduce_sumを残すことを忘れました。これを追加すると、マトリックスではなくスカラーが残されます。 – Michel
うれしかった! –