我正在尝试实施CNN,但我遇到了一个小问题。
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)
如可见,losses
函数无法正常运行,因为logits
和onehot_labels
具有不同的形状。 logits
为shape=(2,)
而onehot_labels
为shape=(3,)
,这是因为它取决于y
占位符[batch_size, 10]
。
我不知道如何解决这个问题。我需要改变这些变量的形状,但我不确定是哪一个。 CNN是否需要y
作为标签,以batch_size
作为参数?我哪里错了?
一些额外的信息,我打算在会话中运行CNN ......
# 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})
答案 0 :(得分:1)
如果你的标签数据是实际的类,那么代码应该是:
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)
请参阅mint tutorial以获取示例。