yolov7导入注意力机制出现Missing key(s) in state_dict:

在给yolov7加Senet注意力机制练习的时候,遇到了在train之后,getmap出现了报错

RuntimeError: Error(s) in loading state_dict for YoloBody:
Missing key(s) in state_dict: "feat1_att.fc.0.weight", "feat1_att.fc.2.weight", "feat2_att.fc.0.weight", "feat2_att.fc.2.weight", "feat3_att.fc.0.weight", "feat3_att.fc.2.weight", "upsample_att1.fc.0.weight", "upsample_att1.fc.2.weight", "upsample_att2.fc.0.weight", "upsample_att2.fc.2.weight".

然后我就去打印模型和state_dict,结果注意力模块在相应的位置和state_dict中都有,我在想是不是训练模型中最终保存的权值不存在相对应权值,我就把pth文件打开看了一下,果然没有注意力模块的权值。想问一下为什么

该回答引用ChatGPT

这种情况通常是由于在模型训练和保存过程中出现了错误导致的。

具体来说,可能是由于在训练过程中没有正确地初始化注意力模块的权重,或者在保存权重时出现了错误,导致注意力模块的权重没有正确地保存到权重文件中。这些问题都可能导致加载权重文件时出现缺失的权重参数。

为了解决这个问题,建议检查模型定义和训练过程中注意力模块的实现。特别是注意力模块的权重应该被正确地初始化,并在训练过程中被正确地更新。如果模型训练的过程中没有输出相关的错误信息,可以通过在训练过程中增加调试输出来检查注意力模块的权重是否被正确地计算和更新。

另外,在保存权重时,可以使用PyTorch提供的torch.save函数保存整个模型或者模型的部分权重,确保注意力模块的权重被正确地保存到权重文件中。同时,也可以在加载权重文件之前,检查权重文件中是否包含了模型的所有权重参数,避免出现缺失的权重参数。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这个错误通常发生在模型加载时,因为在加载状态字典(state_dict)时缺少了某些键,通常情况下是由于模型结构的改变或者使用了不同的state_dict导致的。
-
在你的情况中,你增加了Senet注意力机制,并尝试从之前的state_dict中加载权值。然而,由于你的模型结构已经发生了变化,新添加的权值不在旧的state_dict中,因此加载过程中会发生缺失键的错误。
-
解决方法是重新训练模型,这样可以生成包含新的权重的新state_dict。然后,你可以使用新的state_dict加载模型,并确保所有的权值都已经正确加载。如果你想在旧的state_dict中继续使用已有的权值,你需要手动将缺失的键添加到旧的state_dict中,并将其设置为默认值,例如:

state_dict['feat1_att.fc.0.weight'] = torch.zeros_like(model.state_dict()['feat1_att.fc.0.weight'])
state_dict['feat1_att.fc.2.weight'] = torch.zeros_like(model.state_dict()['feat1_att.fc.2.weight'])
# 以此类推,添加所有缺失的键


但这种方法并不推荐,因为它可能会导致模型性能下降。