我正在尝试学习tensorflow并且遇到以下错误: logits和标签必须是可广播的:logits_size = [32,1] labels_size = [16,1]
当我将此作为输入时,代码运行良好:
self.input = np.ones((500, 784))
self.y = np.ones((500, 1))
但是,当我添加尺寸时,会引发错误:
self.input = np.ones((500, 2, 784))
self.y = np.ones((500, 1))
用于构建图形的代码
self.x = tf.placeholder(tf.float32, shape=[None] + self.config.state_size)
self.y = tf.placeholder(tf.float32, shape=[None, 1])
# network architecture
d1 = tf.layers.dense(self.x, 512, activation=tf.nn.relu, name="dense1")
d2 = tf.layers.dense(d1, 1, name="dense2")
with tf.name_scope("loss"):
self.cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.y, logits=d2))
self.train_step = tf.train.AdamOptimizer(self.config.learning_rate).minimize(self.cross_entropy,
global_step=self.global_step_tensor)
correct_prediction = tf.equal(tf.argmax(d2, 1), tf.argmax(self.y, 1))
self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
有人可以向我解释为什么会发生这种情况以及如何解决此问题吗?
答案 0 :(得分:2)
logits
是通常为网络输出提供的名称,这是您的预测。大小为[32, 10]
告诉我,您的批处理大小为32,有10个输出,例如mnist常用的输出,就像您正在使用的那样。
您的标签大小为[16, 10]
,也就是说,您要提供16个大小为10的标签/向量。您提供的标签数量与网络的输出冲突,它们应该一样。
我不太清楚输入中的额外维度在做什么,但是我想您一定是以某种方式不小心将样本加倍了。也许[500, 2, 784]
的形状会在此过程中的某个位置自动重塑为[1000, 784]
,然后与500个标签不匹配。另外,您的self.y
的形状应为[500, 10]
,而不是[500, 1]
,标签的格式必须为一格编码。例如。数字3的形状为[1, 10]
的单个标签为[[0,0,0,1,0,0,0,0,0,0,0]]
,而不是数字表示形式,例如[3]
似乎已在您的健全性测试中设置过。