logits和标签必须是可广播的:logits_size = [32,1] labels_size = [16,1]

时间:2018-10-24 20:48:13

标签: python tensorflow

我正在尝试学习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))

有人可以向我解释为什么会发生这种情况以及如何解决此问题吗?

1 个答案:

答案 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]似乎已在您的健全性测试中设置过。