您当前的位置: 首页 >  ui

FPGA硅农

暂无认证

  • 0浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

FPGA硅农 发布时间:2021-08-12 00:26:28 ,浏览量:0

在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后,打印结果正确。

 

 

 

关注
打赏
1658642721
查看更多评论
立即登录/注册

微信扫码登录

0.0381s