PyTorch训练RNN时第二个epoch报错cannot assign 'torch.cuda.FloatTensor'如何解决
问题原因
报错核心是RNN层的参数类型不匹配,从异常栈可以定位到问题出自weight_drop.py的权重dropout实现逻辑:
PyTorch RNN层的weight_hh_l0这类内置属性要求必须是torch.nn.Parameter类型,你所用的代码仓库中的权重dropout实现,对原始权重施加dropout操作后,直接将返回的普通CUDA张量赋值给了RNN的权重属性,覆盖了原有的Parameter类型值。
第一个epoch运行正常是因为首次赋值时刚好未触发严格的类型校验,等到第二个epoch启动、再次调用权重赋值逻辑时,PyTorch的类型检查生效,就抛出了类型错误。你之前修改设备迁移写法的操作和该问题无关,所以不会生效。
解决方法
修改pytorch_src/weight_drop.py文件中的_setweights方法即可:
- 找到该方法中给RNN层权重赋值的代码行:
setattr(self.module, name_w, w)
- 将赋值的张量用
torch.nn.Parameter包裹,修改为:
setattr(self.module, name_w, torch.nn.Parameter(w, requires_grad=False))
设置requires_grad=False是因为该dropout后的权重仅用于前向计算,梯度需要回传到原始存储的未dropout权重上,不需要对该临时权重计算梯度。
内容的提问来源于stack exchange,提问作者user3084192
相关产品推荐
相关产品推荐

