python - logits 和 label 的大小必须相同
问题描述
我尝试制作一个自定义网络来训练 ck+48,但我得到了错误日志,并且标签必须是可广播的。
这是我的网络代码:
def getModel(训练, input_shape = (48,48,3)):
model = models.Sequential()
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=input_shape))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='softmax'))
model.add(layers.Dense(len(set(traing.classes))))
print(model.summary())
opt = tf.keras.optimizers.Nadam(learning_rate=4e-5, epsilon=1e-6)
loss = tf.keras.losses.CategoricalCrossentropy(from_logits=True)#BinaryCrossentropy(from_logits=True) #False
metric = tf.keras.metrics.CategoricalAccuracy('accuracy')#BinaryAccuracy('accuracy')
model.compile(optimizer=opt, loss=loss, metrics=[metric])
return model
我用这个函数读取所有数据:
def getData(foldername, train_size=0.1, seed=1):
data = ImageDataGenerator(validation_split=train_size, rescale = 1./255)
train_generator = data.flow_from_directory( folder_name,
target_size = (48, 48),
batch_size=64,
subset='training',
seed=seed)
valid_generator = data.flow_from_directory( folder_name,
target_size = (48, 48),
batch_size=64,
subset='validation',
seed=seed,
shuffle=False)
return train_generator, valid_generator
"""
folderName = CK+48
structure
-CK+48
-angry
-image1
-image2
-suprised
-disgust
"""
开始训练:
history = model.fit(train_generator,
steps_per_epoch = train_generator.n // train_generator.batch_size,
epochs=500,
)
和总结
Found 887 images belonging to 7 classes.
Found 94 images belonging to 7 classes.
Model: "sequential_10"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_50 (Conv2D) (None, 46, 46, 64) 1792
conv2d_51 (Conv2D) (None, 44, 44, 64) 36928
max_pooling2d_20 (MaxPoolin (None, 22, 22, 64) 0
g2D)
conv2d_52 (Conv2D) (None, 20, 20, 64) 36928
conv2d_53 (Conv2D) (None, 18, 18, 64) 36928
max_pooling2d_21 (MaxPoolin (None, 9, 9, 64) 0
g2D)
conv2d_54 (Conv2D) (None, 7, 7, 64) 36928
flatten_10 (Flatten) (None, 3136) 0
dense_19 (Dense) (None, 64) 200768
dense_20 (Dense) (None, 7) 455
=================================================================
Total params: 350,727
Trainable params: 350,727
Non-trainable params: 0
_________________________________________________________________
None
错误
InvalidArgumentError: logits and labels must be broadcastable: logits_size=[1375,7] labels_size=[55,7]
[[node categorical_crossentropy/softmax_cross_entropy_with_logits
(defined at /usr/local/lib/python3.7/dist-packages/keras/backend.py:5010)
]] [Op:__inference_train_function_16550]
Errors may have originated from an input operation.
Input Source operations connected to node categorical_crossentropy/softmax_cross_entropy_with_logits:
In[0] categorical_crossentropy/softmax_cross_entropy_with_logits/Reshape:
In[1] categorical_crossentropy/softmax_cross_entropy_with_logits/Reshape_1:
我在互联网上搜索了这个错误,尤其是stackoverflow,有很多这种类型的错误,但我无法解决问题。
感谢您的帮助。
解决方案
推荐阅读
- python-3.x - 字符串切片:以 -1 结尾的索引规范似乎是错误的
- excel - 从电子表格中查找并记录多个同名条目
- r - 一次加载多个 csv 文件并保持列名不变
- azure - 如何从 azure 应用服务连接字符串中检索未加密的密码
- r - 在带有 ggplot2 的 ggarrange 中使用 common.legend 时缺少图例项
- html - 试图创建一个网页来远程引爆模型火箭
- c++ - sizeof(struct name_of_struct) 与 sizeof(name_of_struct) 的区别?
- python - 如何在 python 中的现有文本文件中添加一列?
- php - 段落中第一句的 Xpath 表达式
- rest - 我如何将 curl 转换为 powershell