基于DenseNet121+手工特征的回归模型输入不匹配问题求助
问题与解决方案
问题描述
我有RGB图像,想要构建一个以DenseNet121为骨干网络、结合CSV文件中手工特征的回归模型来预测Lodging_score。运行代码时出现错误:
ValueError: Layer "model" expects 2 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, None, None, None) dtype=float32>]
错误原因
模型定义了图像输入+手工特征输入两个输入分支,但训练时仅传入了图像生成器的单输入数据,没有将手工特征与图像数据按批次配对传入,导致模型接收的输入数量不匹配。
解决方案
1. 自定义混合数据生成器
flow_from_dataframe仅能输出图像数据,无法同时关联手工特征,因此需要自定义生成器,按批次将图像和对应的手工特征组合:
def hybrid_generator(image_generator, features_array, batch_size): while True: # 获取当前批次的图像和标签 image_batch, label_batch = next(image_generator) # 计算当前批次的索引范围 current_idx = image_generator.batch_index * batch_size if current_idx >= len(image_generator.filenames): current_idx = 0 end_idx = current_idx + batch_size # 取出对应批次的手工特征 features_batch = features_array[current_idx:end_idx] # 返回双输入和标签 yield [image_batch, features_batch], label_batch
2. 替换原有生成器
将训练、验证、测试阶段的图像生成器包装为混合生成器:
# 创建混合训练/验证/测试生成器 train_hybrid_gen = hybrid_generator(train_generator, train_features, batch_size) val_hybrid_gen = hybrid_generator(val_generator, val_features, batch_size) test_hybrid_gen = hybrid_generator(test_generator, test_features, batch_size)
3. 修改训练逻辑
更新model.fit,使用混合生成器作为输入:
# 训练模型 history = model.fit( train_hybrid_gen, steps_per_epoch=len(train_generator), epochs=50, validation_data=val_hybrid_gen, validation_steps=len(val_generator), callbacks=[early_stopping])
4. 修改评估与预测逻辑
同样使用混合生成器完成评估和预测:
# 评估模型 loss = model.evaluate(test_hybrid_gen, steps=len(test_generator), verbose=0) # 生成预测结果 predictions = model.predict(test_hybrid_gen, steps=len(test_generator))
额外注意事项
- 保持
shuffle=False,确保图像与手工特征的顺序严格对应;若需要打乱数据,需同步对图像文件名和手工特征的索引进行随机打乱。 - 验证集和测试集必须使用相同的混合生成器逻辑,避免输入不匹配问题。
内容的提问来源于stack exchange,提问作者Amilovsky
相关产品推荐
相关产品推荐

