pytorch中requires_grad=false却还能训练的问题

在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)

pytorch中requires_grad=false却还能训练的问题_第1张图片

经过一番google,终于找到了答案链接,解决方法如下图所示,共三种

pytorch中requires_grad=false却还能训练的问题_第2张图片

可以看到,若采用state_dict(),则加入keep_vars=True后,打印结果正确。

pytorch中requires_grad=false却还能训练的问题_第3张图片

 

 

 

你可能感兴趣的:(笔记,python)