在pytorch中,requires_grad用于指示该张量是否参与梯度的计算,我们可以通过如下方式来修改一个张量的该属性:
tensor.requires_grad_() //True or False
然而,本人在写代码的过程中发现,在搭建完一个网络之后,打印所有参数的requires_grad属性,结果显示全为false,但训练时loss损失函数却能下降,令人百思不得其解,代码和打印输出的结果如下:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1=nn.Conv2d(1,64,5,stride=1,padding=2)
self.relu1=nn.ReLU()
self.conv2=nn.Conv2d(64,64,5,stride=1,padding=2)
self.relu2=nn.ReLU()
self.pool1=nn.MaxPool2d(kernel_size=2,stride=2,padding=0)
self.conv3=nn.Conv2d(64,64,5,stride=1,padding=2)
self.relu3=nn.ReLU()
self.conv4=nn.Conv2d(64,64,5,stride=1,padding=2)
self.relu4=nn.ReLU()
self.pool2=nn.MaxPool2d(kernel_size=2,stride=2,padding=0)
self.fc1 = nn.Linear(64*7*7, 10)
def forward(self, x):
x=self.conv1(x)
x=self.relu1(x)
x=self.conv2(x)
x=self.relu2(x)
x=self.pool1(x)
x=self.conv3(x)
x=self.relu3(x)
x=self.conv4(x)
x=self.relu4(x)
x=self.pool2(x)
x=x.view(-1,64*7*7)
x=self.fc1(x)
return x
net = Net().to('cuda')
optimizer = optim.SGD(net.parameters(), lr=0.005, momentum=0.9)
train_loss = []
precision=0
print(net)
for name,param in net.state_dict().items():
print(name,param.requires_grad)
经过一番google,终于找到了答案链接,解决方法如下图所示,共三种
可以看到,若采用state_dict(),则加入keep_vars=True后,打印结果正确。