复现Flickr8k图像字幕模型时出现dense层输入维度不兼容报错
错误原因分析
这个报错的核心是Concatenate层拼接后的张量维度不符合后续LSTM层的输入要求,导致经过两层LSTM后输出维度异常,常见诱因如下:
- 图像特征提取模型输出维度和原方案不一致,原公开方案用预训练ResNet输出2048维全局特征,如果你修改了特征提取模型,或者没有给图像特征做维度扩展,会导致image_model的输出是(None, 2048)的2维张量,而language_model的输出是(None, 序列长度, 嵌入维度)的3维张量,二者维度不匹配无法直接拼接。
- 没有给图像特征添加时间维度:图像特征是单时间步的特征,要和语言序列的时间维度对齐,需要先将图像特征复制成和序列长度一致的3维张量,再和语言模型的输出拼接。
- 词汇表大小
vocab_size定义错误,或是训练数据的next_words标签形状不符合要求。
解决方案
1. 修正图像特征的维度扩展
在拼接前给图像模型输出添加时间维度,示例代码如下,其中max_caption_len替换为你数据集设置的字幕最大长度:
from tensorflow.keras.layers import RepeatVector # 给图像特征扩展时间维度 image_features = RepeatVector(max_caption_len)(image_model.output) # 沿最后一维拼接两个模态的特征 conca = Concatenate(axis=-1)([image_features, language_model.output])
2. 校验各层输出维度
调整完成后先打印各层的输出形状确认匹配:
- 调整后image_features形状应为
(None, max_caption_len, 2048) - language_model输出形状应为
(None, max_caption_len, 嵌入维度)(常规配置下嵌入维度为256) - 拼接后的conca形状应为
(None, max_caption_len, 2048+嵌入维度),符合LSTM层要求的3维输入格式
3. 验证训练标签形状
确认next_words的形状是(None, vocab_size),如果是一维的整数标签,需要先用to_categorical方法转换为独热编码格式。
4. 可选调整LSTM参数
如果仍有维度报错,可以将第一层LSTM的return_sequences参数改为False,或是调整隐藏层维度适配你的输入尺寸。
内容的提问来源于stack exchange,提问作者Nimesh Kumar
相关产品推荐
相关产品推荐

