【问题标题】:TensorFlow error: logits and labels must be same sizeTensorFlow 错误:logits 和标签必须相同大小
【发布时间】:2016-04-03 19:57:45
【问题描述】:

我一直在尝试通过基于 Internet 上的各种示例实现 SimilarAlexNet 来学习 TensorFlow。基本上扩展 AlexNet 示例 here 以获取 224x224 RGB 图像(而不是 28x28 灰度图像),并根据我在网上找到的其他 AlexNet 实现添加更多层、更改内核大小、步幅等。

已经解决了许多不匹配的形状类型错误,但这个让我很难过:

tensorflow.python.framework.errors.InvalidArgumentError: logits and labels must be same size: logits_size=dim { size: 49 } dim { size: 10 } labels_size=dim { size: 1 } dim { size: 10 }
     [[Node: SoftmaxCrossEntropyWithLogits = SoftmaxCrossEntropyWithLogits[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:0"](Softmax, _recv_Placeholder_1_0/_13)]]
     [[Node: gradients/Mean_grad/range_1/_17 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_457_gradients/Mean_grad/range_1", tensor_type=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

49 维特别令人费解。对于调试,我的批量大小目前是 1,如果我将它增加到 2,那么 49 就变成了 98。

如果我记录我传递给的 x 和 y 的形状

sess.run(optimizer, feed_dict={x: batchImages, y: batchLabels, keepProb: P_DROPOUT})

我明白了

x shape: (1, 150528)
y shape: (1, 10)

正如预期的那样:150528 = 224 * 224 RGB 像素,以及代表我的标签的 one-hot 向量。

如果您能帮我们解决这个问题,我们将不胜感激!

更新:此处显示错误的代码:

https://gist.github.com/j4m3z0r/e70096d0f7bd4bd24c42

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    感谢您作为 Gist 分享您的代码。要使形状一致,需要进行两项更改:

    1. 行:

      fc1 = tf.reshape(pool5, [-1, wd1Shape[0]])
      

      ...负责批处理维度中的错误49。输入是 1 x 7 x 7 x 256,它被重新整形为 49 x 256,因为 wd1Shape[0] 是 256。一种可能的替换如下:

      pool5Shape = pool5.get_shape().as_list()
      fc1 = tf.reshape(pool5, [-1, pool5Shape[1] * pool5Shape[2] * pool5Shape[3]])
      

      ...这将使fc1 的形状为 1 x 12544。

    2. 进行此更改后,'wd1' 权重矩阵的大小 (256 x 4096) 与 fc1 中的节点数不匹配。您可以按如下方式更改此矩阵的定义:

          'wd1': tf.Variable(tf.random_normal([12544, 4096])),
      

      ...尽管您可能想要修改其他权重,或执行额外的池化以减小此矩阵的大小。

    【讨论】:

    • 太棒了。谢谢。我想我可以解决这个问题。非常感谢。
    • 后续问题:在这种情况下,有没有办法让 TensorFlow 以更丰富的方式失败?看来 TF 可能已经发现在您标记的那条线上有不匹配的形状。
    • 我认为问题在于重塑中的 -1,它充当通配符并且(在这种情况下)丢失了有关前导维度的信息。这使得 TensorFlow 在不运行程序的情况下很难知道真实的形状,甚至可能有有效的程序可以将单个示例拆分为 49 个较小的示例。我们可能需要更好的方法来表达批量大小的不变转换以避免这种情况(tf.expand_dims()tf.squeeze() 很有帮助,但对于这种情况,我们可能需要 tf.flatten_dims())。
    • @mrry,感谢您的上述回答。我不知何故无法理解解决方案。如果批量大小为 15,我得到一个错误,即它应该等于 (315,3) 的标签大小。 315 是我的训练集,3 是我的课程数量。我不明白如何使我的批量大小等于那个?
    【解决方案2】:

    我在使用 model.fit(..) 时遇到了类似的问题。 结果我的 output_size 被定义为 2,而使用“binary_crossentropy”作为损失函数,而它应该被定义为 1。

    【讨论】:

      【解决方案3】:

      鉴于您没有提供您正在使用的实际代码,因此很难准确说出问题所在。

      以下是调试此类问题的一些一般提示:

      • print(tensor.get_shape()) 添加到与问题相关的位置(在您的情况下,dense2、out、_weights['out']、_biases['out'] 是可疑的)。

      • 确保您的矩阵乘法顺序正确(例如,dense2 乘 _weights['out'],应该得到 batch_size x 10 矩阵)。

      如果您修改了您链接的 AlexNet 中的代码,您可能已经更改了下一行:

       dense1 = tf.reshape(norm3, [-1, _weights['wd1'].get_shape().as_list()[0]]) # Reshape conv3 output to fit dense layer input
       dense1 = tf.nn.relu(tf.matmul(dense1, _weights['wd1']) + _biases['bd1'], name='fc1') # Relu activation
       dense2 = tf.nn.relu(tf.matmul(dense1, _weights['wd2']) + _biases['bd2'], name='fc2') # Relu activation
       out = tf.matmul(dense2, _weights['out']) + _biases['out']
      

      在您的情况下,dense2 的形状可能是 [49, 1024] 。您可以通过添加打印dense2.get_shape() 来检查。您应该打印所有张量的形状,直到找到一个得到 49 的张量。我只能猜测您更改了什么,但它可能是重塑之一。

      【讨论】:

      • 感谢您的来信。我在这里上传了一个独立的要点并演示了这个问题:gist.github.com/j4m3z0r/e70096d0f7bd4bd24c42 你是对的:最大池化层最终大小为 7x7 = 49。
      • 好的,取得一些进展:在各种卷积之后添加更多的 maxpool 层将 49 减少到 4,我认为这是有道理的:我们从更高分辨率的输入开始,所以我们需要更多的 maxPool 层导致对输入进行相应的下采样。
      • 第一个维度应该是批量大小,所以即使它是 4 - 它仍然不正确。我认为问题fc1 = tf.reshape(pool5, [-1, wd1Shape[0]]) 就在这一行。当您执行 -1 时 - 它几乎捕获了 pool5 的其​​余部分。尝试将 -1 替换为 1(您的批量大小)并查看是否存在不匹配 - 并将 wd1Shape[0] 的整形改正为应有的值。
      【解决方案4】:

      这个问题是因为你的类变量和标签不匹配。

      例如:- 在您的代码中,您将类变量声明为 10 但标签可能不是 10。

      一旦你让你的类变量和标签相同的维度。此问题将得到解决。

      【讨论】:

        猜你喜欢
        • 2016-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        相关资源
        最近更新 更多