python-3.x - logits 和 labels 必须具有相同的第一维,得到 logits 形状 [3662,5] 和标签形状 [18310]
问题描述
我正在尝试使用 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 数组并在转换为张量后(与文档中的输入相同)
解决方案
损失函数的选择问题线tf.keras.losses.SparseCategoricalCrossentropy()
。根据您要实现的目标,您应该使用tf.keras.losses.CategoricalCrossentropy()
. 即,状态的文档tf.keras.losses.SparseCategoricalCrossentropy()
:
当有两个或多个标签类时,使用此交叉熵损失函数。我们希望标签以整数形式提供。
另一方面,国家的文件tf.keras.losses.CategoricalCrossentropy()
:
我们希望以 one_hot 表示形式提供标签。
而且因为您的标签被编码为 one-hot,所以您应该使用tf.keras.losses.CategoricalCrossentropy()
.
推荐阅读
- angular - Ngrx Data GetAll 并修改路径
- c++ - 在第 0 行第 0 列出现错误:转换错误
- functional-programming - 尾递归解决方案的反面是什么?
- powershell - 使用 Powershell 数组中的键创建 JSON
- laravel - vue js - 默认选中一个单选按钮
- javascript - 如何让javascript计算器中的加法和减法函数正常工作?
- rxjs - 为什么 bufferTime(5000, 10000) 显示我在 5000 毫秒后创建的值
- c++ - 计算双引号内的字符数
- google-drive-api - 如何在 Windows 10 中压缩一个大文件夹,将其上传到 GDrive,然后解压缩?
- wso2 - 使用拦截器的 wso2 微网关基本身份验证