Keras多输入模型调用model.fit报'tuple'无shape属性错误如何解决?
问题根源
- 自定义数据生成器的标签返回格式不符合单输出模型的要求:你的
create_data_generator函数在返回数据时,将标签包裹在了列表中yield [_gen1, _gen2], [_gen1_l],而你的模型只有1个输出,Keras 单输出模型默认期望接收的标签是单个张量,而非被列表/元组包裹的张量。 - 指标计算时结构不匹配:当启用
metrics=['acc']时,Keras会自动对齐标签和模型输出的结构,你返回的列表格式标签会被解析为tuple结构,和模型单输出的张量结构无法匹配,触发了访问shape属性的报错。
解决方案
二选一即可:
方案1:修改生成器返回格式(推荐)
直接返回单个标签张量,去掉标签外层的列表包裹:
def create_data_generator(data_gen_one, data_gen_two): while(True): _gen1, _gen1_l = next(data_gen_one) _gen2, _gen2_l = next(data_gen_two) # 标签不包裹列表,直接返回单个张量 yield [_gen1, _gen2], _gen1_l
注:你已经设置两个生成器
shuffle=False且两份DataFrame样本顺序一致,可保证输入和标签的对应关系正确。
方案2:对齐模型编译时的指标格式
如果不想修改生成器代码,可在编译模型时将指标也包裹为对应层级的列表,匹配标签的结构:
model.compile( optimizer="adam", loss="categorical_crossentropy", # 标签是长度为1的列表,指标也对应包裹为嵌套列表 metrics=[["acc"]] )
额外优化建议
你的卷积层构造函数中存在变量重复定义的问题(acti02、pool02被多次赋值),虽然不会触发本次报错,但可能导致后续调试逻辑混乱,建议修改为唯一变量名。
内容的提问来源于stack exchange,提问作者Sensei Munk
相关产品推荐
相关产品推荐

