PyTorch神经网络嵌套自定义Module类的训练权重是否需要单独加载?
PyTorch嵌套子模块权重加载问题解答
核心结论
不需要单独加载SelfAttention类的权重,你给出的额外加载操作完全没有必要,甚至可能引发权重覆盖问题。
原理说明
PyTorch的nn.Module对参数的管理是递归的:
- 当你保存
ActualModel的checkpoint时,无论是直接保存整个模型对象,还是保存更推荐的state_dict,都会自动包含所有层级子模块的已训练参数,SelfAttention内部的multihead_attn权重自然也会被完整保存在actual_model.pth里。 - 加载
actual_model.pth时,对应SelfAttention的权重会被正常还原,不会被重新初始化,不需要任何额外操作。
多余操作的风险
你代码中pred_or_continue_train方法里单独加载self_attention.pth的操作,反而会直接覆盖从actual_model.pth中已经加载好的SelfAttention权重,除非你明确需要用单独保存的SelfAttention权重替换原有模型中的对应部分,否则不要加这段逻辑。
原代码的小问题提醒
你提供的初始代码有两处会导致运行报错的问题,建议先修复:
- 所有继承
nn.Module的子类,__init__方法第一行需要先调用super().__init__(),否则参数不会被正确注册到模块中。 SelfAttention类的前向传播方法名拼写错误,你写的是foward,正确拼写是forward。
内容的提问来源于stack exchange,提问作者angryweasel
相关产品推荐
相关产品推荐

