张量不同大小的物体

时间:2017-10-23 05:57:12

标签: python-3.x tensorflow conv-neural-network

我正在尝试实施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函数无法正常运行,因为logitsonehot_labels具有不同的形状。 logitsshape=(2,)onehot_labelsshape=(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})

1 个答案:

答案 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以获取示例。