美文网首页
Pytorch固定部分参数(只训练部分层)

Pytorch固定部分参数(只训练部分层)

作者: 吐舌小狗 | 来源:发表于2018-06-11 21:23 被阅读1238次

    应用场景: 在加载预训练模型之后,在原来的基础上添加一部分的网络,我们可以固定原来的参数,然后只训练我们添加的这部分网络,完了之后再全部训练.

    class RESNET_attention(nn.Module):
        def __init__(self, model, pretrained):
            super(RESNET_attetnion, self).__init__()
            self.resnet = model(pretrained)
            for p in self.parameters():
                p.requires_grad = False
            self.f = nn.Conv2d(2048, 512, 1)
            self.g = nn.Conv2d(2048, 512, 1)
            self.h = nn.Conv2d(2048, 2048, 1)
            self.softmax = nn.Softmax(-1)
            self.gamma = nn.Parameter(torch.FloatTensor([0.0]))
            self.avgpool = nn.AvgPool2d(7, stride=1)
            self.resnet.fc = nn.Linear(2048, 10)
    

    note:以上代码复现SAGAN的Attention部分,这不是主要问题

    这样就将for循环以上的参数固定, 只训练下面的参数(f,g,h,gamma,fc,等), 但是注意需要在optimizer中添加上这样的一句话filter(lambda p: p.requires_grad, model.parameters()
    添加的位置为:
    optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.0001, betas=(0.9, 0.999), eps=1e-08, weight_decay=1e-5)

    相关文章

      网友评论

          本文标题:Pytorch固定部分参数(只训练部分层)

          本文链接:https://www.haomeiwen.com/subject/vqckeftx.html