如何修复PyTorch中'GRU'对象无'_flat_weights_names'属性的报错?
解决GRU对象无
_flat_weights_names属性的报错 问题原因
d2l库的train_seq2seq函数内置的xavier_init_weights初始化方法,试图访问PyTorch中GRU模块的私有属性_flat_weights_names。但这个属性是PyTorch旧版本的内部实现,在你当前使用的新版本中已被移除,因此触发AttributeError。
修复方案
方案1:修改d2l库的初始化逻辑
找到本地d2l库的torch.py文件(路径为~\AppData\Roaming\Python\Python37\site-packages\d2l\torch.py),定位到xavier_init_weights函数,将GRU的初始化代码替换为:
def xavier_init_weights(m): if type(m) == nn.Linear: nn.init.xavier_uniform_(m.weight) if type(m) == nn.GRU: # 替换原有的私有属性遍历逻辑,改用公开的named_parameters方法 for name, param in m.named_parameters(): if "weight" in name: nn.init.xavier_uniform_(param)
方案2:自定义初始化逻辑(不修改d2l源码)
在自己的代码里定义新的初始化函数,手动给模型初始化,跳过d2l内置的有问题的初始化:
import torch.nn as nn from torch.nn import init def custom_xavier_init(m): if isinstance(m, nn.Linear): init.xavier_uniform_(m.weight) elif isinstance(m, nn.GRU): for name, param in m.named_parameters(): if "weight" in name: init.xavier_uniform_(param) # 创建模型后先应用自定义初始化 net = d2l.EncoderDecoder(encoder, decoder) net.apply(custom_xavier_init) # 复制d2l.train_seq2seq的代码到本地,删除其中的net.apply(xavier_init_weights)行,再调用 # 或者如果不想复制源码,也可以直接修改d2l的torch.py文件(参考方案1)
方案3:回退到兼容的PyTorch版本
如果不想修改代码,可安装保留_flat_weights_names属性的旧版PyTorch(比如1.12.x版本):
pip install torch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1
内容的提问来源于stack exchange,提问作者user20388028
相关产品推荐
相关产品推荐

