被这个问题困扰了很久,用nn.parameter()定义了参数,但该参数没有更新,.grad() 为none, is_leaf 为False, 其了个怪了。原来是在参数初始化的时候没有正确初始化,我好菜~~~~~。
1) 先看正确的例子
import torch
import torch.nn as nn
class Mask(nn.Module):
def __init__(self):
super(Mask, self).__init__()
self.weight = (torch.nn.Parameter(data=torch.Tensor(1, 1, 1, 1), requires_grad=True))
self.weight.data.uniform_(-1, 1)
print(self.weight.is_leaf)
def forward(self, x):
masked_wt = (self.weight.mul(1)).cuda()
return masked_wt
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.Mask = Mask()
def forward(self, x):
x = Mask(x)
return x
model = Model()
for name, param in model.named_parameters():
print(name, param)
输出为
True
Mask.weight Parameter containing:
tensor([[[[0.7625]]]], requires_grad=True)

本文通过示例详细介绍了在PyTorch中自定义新层时,参数初始化和更新的常见错误及其原因。错误案例包括:在初始化时直接使用.cuda()将参数加载到GPU和使用.view()改变参数形状,导致参数未被正确添加到模型参数池,进而无法进行梯度更新。正确的做法是在初始化后调用.cuda()和.view()。
最低0.47元/天 解锁文章
436

被折叠的 条评论
为什么被折叠?



