如何使用Keras Applications预训练CNN搭建多输出模型并解决输入报错
Keras Applications搭建多输出模型问题排查
核心错误1:输入通道不匹配
你收到的报错:
ValueError: Input 0 of layer block1_conv1 is incompatible with the layer: expected axis -1 of input shape to have value 3 but received input with shape (None, 64, 64, 1)
触发原因:你加载的VGG16使用ImageNet预训练权重,该权重是基于3通道RGB图像训练的,代码中也定义了输入形状最后一维为3,但你实际传入的训练数据是单通道灰度图,维度不匹配。
解决方法:
如果要保留预训练权重做迁移学习,直接把输入数据的单通道复制为3通道即可:
# 假设x_train、x_test原始形状为(样本数, 64, 64, 1) x_train = np.repeat(x_train, 3, axis=-1) x_test = np.repeat(x_test, 3, axis=-1)
如果不需要使用预训练权重,可以直接修改VGG16的输入参数适配单通道:
base_model = VGG16(weights=None, include_top=False, input_shape=(IMG_HEIGHT, IMG_WIDTH, 1))
核心错误2:变量名未定义
你的性别分类分支代码中,Dropout层传入了不存在的变量gender_x,会触发NameError,直接修正变量名即可:
# 原错误代码 sex_x = Dropout(0.5)(gender_x) # 修正后 sex_x = Dropout(0.5)(sex_x)
可选优化点
- 性别是二分类任务,你当前用2个神经元加sigmoid激活的写法可以简化为1个神经元加sigmoid激活,减少参数冗余,对应标签只要是0/1格式的一维数组即可
- 多输出训练可以单独指定每个输出的损失权重、评估指标,训练结果更直观:
model.compile( optimizer = 'adam', loss =['binary_crossentropy','mae'], loss_weights = [1, 0.5], # 可根据两个任务的优先级调整权重占比 metrics={'dense':'accuracy', 'dense_1':'mae'} # 按输出层名称对应指定评估指标 )
你搭建多输出模型的分支结构逻辑本身没有问题,修正上述错误后即可正常运行。
内容的提问来源于stack exchange,提问作者Zuckerbrenner
相关产品推荐
相关产品推荐

