2017-10-23 7 views
0

CNNを実装しようとしていますが、マイナーな問題が発生しました。Tensor異なるサイズのオブジェクト

x = tf.placeholder(tf.float32, [None, 28, 28, 1]) 

# 0-9 digits recognition => 10 classes. 
y = tf.placeholder(tf.float32, [None, 10]) 

...code for layers... 
...etc.... 

# Output has a shape of [batch_size, 10] 
logits = tf.layers.dense(inputs=dropout, units=10) 

# Softmax layer for deriving probabilities. 
pred = tf.nn.softmax(logits, name="softmax_tensor") 

# Convert labels to a one-hot encoding. 
onehot_labels = tf.one_hot(indices=tf.cast(y, tf.int32), depth=10) 
loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=logits) 

見えるようlogitsonehot_labelsは異なる形状のものであるので、losses機能が正しく実行されません。 logitsshape=(2,)であり、onehot_labelsshape=(3,)であり、これはyプレースホルダー([batch_size, 10])に依存するためです。

これを修正する方法がわかりません。私はこれらの変数のいずれかの形状を変更する必要がありますが、どの変数が正しいかわかりません。 CNNは、batch_sizeを引数として持つラベルであるyを要求していますか?どこが間違っていますか?

いくつかの余分な情報、私は

# Assign the contents of `batch_xs` to variable `x`. 
_, c = sess.run([train_op, loss], feed_dict={x:sess.run(batch_xs), y:batch_ys}) 

答えて

1

..ようにセッション内でCNNを実行する予定あなたのラベルデータが実際のクラスである場合、コードは次のようになります。

y = tf.placeholder(tf.float32, [None, 1]) 
... 
onehot_labels = tf.one_hot(indices=tf.cast(y, tf.int32), depth=10) 
loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=logits) 

それ以外の場合、ラベルは既にワンホットデータである必要があります。

# y is already one-hot label data. 
y = tf.placeholder(tf.float32, [None, 10]) 
... 
loss = tf.losses.softmax_cross_entropy(onehot_labels=y, logits=logits) 

を参照してください。例についてはを参照してください。

+0

あなたが正しいとは限りません。私はCNNチュートリアルから別のデータセットを使用しています。データはすでに1つのホットラベルに変換されています – Bolboa

関連する問題