【问题标题】:logits and labels must have the same first dimension, got logits shape [3662,5] and labels shape [18310]logits 和 labels 必须具有相同的第一维,得到 logits 形状 [3662,5] 和标签形状 [18310]
【发布时间】:2019-08-21 16:23:17
【问题描述】:

我正在尝试使用 tensorflow 创建一个 CNN,我的图像是 64x64x1 图像,并且我有一组 3662 个图像用于训练。我总共有 5 个标签,我有一个热编码。我每次都收到这个错误:

InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [3662,5] and labels shape [18310]
     [[{{node loss_2/dense_5_loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]]

我的神经网络结构是这样的:

def cnn_model():
    model = models.Sequential()
#     model.add(layers.Dense(128, activation='relu', ))
    model.add(layers.Conv2D(128, (3, 3), activation='relu',input_shape=(64, 64, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu',padding = 'same'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Flatten())
    model.add(layers.Dense(5, activation='softmax'))

    model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=['accuracy'])
    print(model.summary())
    return model

我的模型总结是这样的:

Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_9 (Conv2D)            (None, 62, 62, 128)       1280      
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 31, 31, 128)       0         
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 31, 31, 64)        73792     
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 15, 15, 64)        0         
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 15, 15, 64)        36928     
_________________________________________________________________
dense_4 (Dense)              (None, 15, 15, 64)        4160      
_________________________________________________________________
flatten_2 (Flatten)          (None, 14400)             0         
_________________________________________________________________
dense_5 (Dense)              (None, 5)                 72005     
=================================================================
Total params: 188,165
Trainable params: 188,165
Non-trainable params: 0

我的输出数组的形状是 (3662,5,1)。我已经看到了相同问题的其他答案,但我无法弄清楚我的问题。我哪里错了?

编辑:我的标签使用这些以一种热编码形式存储:

df = pd.get_dummies(df)
diag = np.array(df)
diag = np.reshape(diag,(3662,5,1))

我尝试过作为 numpy 数组并在转换为张量后(与文档中的输入相同)

【问题讨论】:

  • 你能把转换的结果也贴在标签上吗?
  • @gorjan 我用这些转换编辑了问题
  • 发布了答案。我想现在应该很清楚了。

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


【解决方案1】:

损失函数tf.keras.losses.SparseCategoricalCrossentropy()的选择问题。根据您要达到的目标,您应该使用tf.keras.losses.CategoricalCrossentropy()。即tf.keras.losses.SparseCategoricalCrossentropy()documentation表示:

当有两个或多个标签类别时,使用此交叉熵损失函数。我们希望标签以整数形式提供。

另一方面,tf.keras.losses.CategoricalCrossentropy()documentation 声明:

我们希望以 one_hot 表示形式提供标签。

而且由于您的标签被编码为 one-hot,因此您应该使用 tf.keras.losses.CategoricalCrossentropy()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 2021-09-16
    • 2021-07-19
    • 2021-07-03
    • 1970-01-01
    • 2022-07-06
    • 2022-01-05
    • 2018-06-29
    相关资源
    最近更新 更多