多模态模型训练报错求助:Bert+ResNet50触发ValueError
问题解决:多模态模型训练时的输出名称不匹配报错
错误原因
生成器返回的目标数据字典使用键'output',但你的模型输出层未指定对应名称,Keras自动为输出层分配了默认名称(如'dense_18'),导致两者名称不匹配,触发ValueError。
解决方案
方法一:给模型输出层指定名称(推荐)
修改模型定义中最后一层Dense的代码,添加name='output'参数,让模型输出名称与生成器返回的目标键一致:
# 修改前 output = Dense(num_classes, activation='softmax')(x) # 修改后 output = Dense(num_classes, activation='softmax', name='output')(x)
这样模型输出层的名称就会是'output',和生成器返回的{'output': np.array(lbls)}完全匹配。
方法二:修改生成器的目标键
如果不想改动模型,可以先查看当前模型输出层的实际名称,执行以下代码:
new_model = image_text_model() print(new_model.output_names)
将输出的名称(比如'dense_18')替换生成器中的'output':
# 修改前 yield {'image_input': images, ...}, {'output': np.array(lbls)} # 修改后(假设输出层名称是dense_18) yield {'image_input': images, ...}, {'dense_18': np.array(lbls)}
注意:此方法不够稳定,当模型结构调整时,输出层名称可能会变化,优先推荐方法一。
额外注意事项
你的训练代码中缺少模型编译步骤,需要在new_model.fit()前添加编译代码,否则模型无法正常训练:
new_model = image_text_model() optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3, epsilon=1e-08, clipnorm=1.0) loss = tf.keras.losses.CategoricalCrossentropy() # 添加编译步骤 new_model.compile(optimizer=optimizer, loss=loss) new_model.fit(train_generator, epochs=2)
内容的提问来源于stack exchange,提问作者madmaneman
相关产品推荐
相关产品推荐

