2016-12-08 5 views
0

私は現在自分自身に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(チュートリアルで使用した元の値)に減らしました。

ありがとうございます。

答えて

1

あなたの損失は数値的に安定していません。損失の代わりにマルチクラスロジスティック回帰のために既に実装されている損失を使用することができます:sigmoid_cross_entropy_with_logits。数値的な問題を避けるために注意深く設計されています。

+0

ありがとうございます。「sigmoid_cross_entropy_with_logits」に変更すると、実際にnanが削除されました。しかし、私は 'tf.nn.sigmoid_cross_entropy_with_logits(y、y_)'を使用して入力を確信していましたが、損失はスカラーではなく行列になります。あれは正しいですか? – Michel

+1

クロスエントロピーの周りにtf.reduce_sumを残すことを忘れました。これを追加すると、マトリックスではなくスカラーが残されます。 – Michel

+0

うれしかった! –

関連する問題