TensorFlow训练模型时出现required broadcastable shapes错误求助
解决TensorFlow训练中"required broadcastable shapes"错误
核心问题分析
报错的本质是模型输出、损失函数与数据集分类数三者不匹配,同时训练参数设置不合理:
- 数据集是3类(
Pure_SET_A/Pure_MachineConnected_SET_C/Mixed_Connected_SET_D),但输出层仅定义2个神经元,且误用二分类的binary_crossentropy损失函数 steps_per_epoch和validation_steps设置远大于实际数据能提供的步数,会导致生成器重复采样,加剧维度不匹配问题
具体修复步骤
1. 修正输出层与损失函数
将输出层神经元数改为3(对应3分类),损失函数替换为多分类专用的categorical_crossentropy,保留softmax激活:
# 原错误代码 x = Dense(2, activation = 'softmax')(x); model.compile(optimizer = Adam(lr=0.00001, clipvalue = 0.5, clipnorm = 1), loss = 'binary_crossentropy', metrics = ['accuracy']); # 修正后代码 x = Dense(3, activation = 'softmax')(x); model.compile(optimizer = Adam(lr=0.00001, clipvalue = 0.5, clipnorm = 1), loss = 'categorical_crossentropy', metrics = ['accuracy']);
注:
flow_from_directory默认使用categorical标签模式,因此搭配categorical_crossentropy是正确的;若需简化标签处理,也可改用sparse_categorical_crossentropy,同时将flow_from_directory的class_mode设为sparse。
2. 修正训练步数参数
根据实际数据集大小计算合理步数:
- 训练集共240张,batch_size=70,
steps_per_epoch应为240 // 70 = 3 - 测试集共60张,batch_size=50,
validation_steps应为60 // 50 = 1
修正后的训练代码:
history = model.fit_generator(generator = train_generator, steps_per_epoch = 3, # 替换原60 validation_data = test_generator, validation_steps = 1, # 替换原2 epochs = 250, verbose = 1, callbacks = [checkpoint]);
也可直接删除
steps_per_epoch和validation_steps参数,Keras会自动根据数据集大小与batch_size计算步数,避免手动设置错误。
3. 额外优化(可选)
- 统一使用
tf.kerasAPI,避免混用独立keras库,减少版本兼容问题 - 若想保留原256*256图片尺寸,需修改VGG16的输入形状:
vgg16_model = keras.applications.VGG16(input_shape=(256,256,3), include_top=False);
验证修复效果
修改后重新运行代码,维度不匹配的报错会消失,训练可正常进行。
内容的提问来源于stack exchange,提问作者Kamijou
相关产品推荐
相关产品推荐

