使用Keras预训练VGG16模型时出现形状不兼容错误
解决Keras VGG16三分类任务中形状不兼容的报错问题
问题场景
在自定义三分类图像任务中使用Keras的VGG16模型,基于《Python深度学习》第8章示例代码开发,数据目录结构如下:
data/ training/ class_1 class_2 class_3
调用model.fit()时触发报错:
ValueError: Shapes (32, 1) and (32, 3) are incompatible
报错原因
模型输出层为layers.Dense(3, activation="softmax"),输出形状为(batch_size, 3)(对应3类的概率分布);但你的标签数据train_labels和val_labels是整数形式的稀疏标签(形状为(样本数,)),而当前使用的损失函数categorical_crossentropy要求标签是one-hot编码格式(形状为(样本数, 类别数)),两者形状不匹配导致报错。
解决方案
提供两种可行方案,任选其一即可:
方案一:修改损失函数(推荐)
将损失函数改为sparse_categorical_crossentropy,该损失专门适配整数形式的稀疏标签,无需修改现有标签数据:
model.compile(loss="sparse_categorical_crossentropy", optimizer="rmsprop", metrics=["accuracy"])
方案二:将标签转换为one-hot编码
保持categorical_crossentropy损失,将整数标签转换为one-hot编码格式:
import numpy as np # 对训练和验证标签进行one-hot编码 train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=3) val_labels = tf.keras.utils.to_categorical(val_labels, num_classes=3)
转换后标签形状变为(128400, 3)和(15600, 3),与模型输出形状匹配。
补充说明
image_dataset_from_directory默认返回整数形式的标签(参数sparse=True为默认值),因此方案一更为简便,无需额外数据处理步骤。
内容的提问来源于stack exchange,提问作者RobertJoseph
相关产品推荐
相关产品推荐

