加载ResNet50预训练权重至图像Captioning模型时遇形状不匹配错误求助
解决ResNet50预训练权重加载到图像Captioning模型时的形状不匹配问题
问题原因
这个错误的核心是你的图像Captioning模型中conv3_block1_0_conv层的参数形状,和ResNet50预训练权重对应层的形状不兼容:
- ResNet50标准结构里,
conv3_block1_0_conv是1×1卷积层,卷积核形状为(1,1,256,512)(对应TensorFlow/Keras格式:(核高, 核宽, 输入通道数, 输出通道数)) - 你待加载的权重形状是
(512,128,1,1),要么是误用了PyTorch格式的权重(PyTorch卷积核格式为(输出通道数, 输入通道数, 核高, 核宽)),要么是你自定义模型时修改了该层的输入/输出通道数,导致和预训练权重不匹配。
解决方案
方案1:直接用Keras内置ResNet50作为特征提取器(最省心)
避免手动加载权重的麻烦,直接调用Keras官方实现的ResNet50,自动适配预训练权重:
from tensorflow.keras.applications import ResNet50 from tensorflow.keras.layers import GlobalAveragePooling2D, Dense from tensorflow.keras.models import Model # 加载不带顶层全连接层的ResNet50,自动加载ImageNet预训练权重 base_resnet = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) # 冻结预训练层(如果不需要微调) base_resnet.trainable = False # 拼接你的图像Captioning后续层(示例) x = base_resnet.output x = GlobalAveragePooling2D()(x) # 这里添加你需要的Captioning相关层(比如映射到LSTM的输入维度) x = Dense(256, activation='relu')(x) # 假设最终输出是 caption 预测层 caption_output = Dense(vocab_size, activation='softmax')(x) # 构建完整的Captioning模型 caption_model = Model(inputs=base_resnet.input, outputs=caption_output)
方案2:手动转换权重形状(适用于非Keras格式的预训练权重)
如果你的预训练权重是PyTorch格式,需要将卷积核的形状进行转置,匹配TensorFlow/Keras的格式:
import numpy as np from tensorflow.keras.models import load_model # 假设你已加载自定义的Captioning模型 model = load_model('your_caption_model.h5') # 假设预训练权重存储在字典pretrained_weights中(比如从PyTorch转换而来) pretrained_weights = np.load('pytorch_resnet_weights.npy', allow_pickle=True).item() # 针对报错的层调整形状 # PyTorch格式 (out_channels, in_channels, h, w) → TensorFlow格式 (h, w, in_channels, out_channels) pretrained_weights['conv3_block1_0_conv/kernel'] = pretrained_weights['conv3_block1_0_conv/kernel'].transpose(2, 3, 1, 0) # 其他形状不匹配的卷积层也需要做同样的转置处理 # 加载调整后的权重 model.set_weights(pretrained_weights)
方案3:跳过形状不匹配的层(适用于自定义修改过ResNet结构的场景)
如果你确实需要修改ResNet的部分层结构,可以加载权重时跳过不匹配的层:
# 加载模型后,按层名匹配加载,跳过形状不兼容的层 model.load_weights('pretrained_resnet50.h5', by_name=True, skip_mismatch=True)
by_name=True:仅加载层名完全匹配的权重skip_mismatch=True:自动跳过形状不兼容的层
内容的提问来源于stack exchange,提问作者Aishwary Shree
相关产品推荐
相关产品推荐

