zoukankan      html  css  js  c++  java
  • pytorch如何冻结某层参数的实现

    这篇文章主要介绍了pytorch如何冻结某层参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    在迁移学习finetune时我们通常需要冻结前几层的参数不参与训练,在Pytorch中的实现如下:

    class Model(nn.Module):
     def __init__(self):
      super(Transfer_model, self).__init__()
      self.linear1 = nn.Linear(20, 50)
      self.linear2 = nn.Linear(50, 20)
      self.linear3 = nn.Linear(20, 2)
    
     def forward(self, x):
     pass
    

      

    假如我们想要冻结linear1层,需要做如下操作:

    model = Model()
    # 这里是一般情况,共享层往往不止一层,所以做一个for循环
    for para in model.linear1.parameters():
     para.requires_grad = False
    # 假如真的只有一层也可以这样操作:
    # model.linear1.weight.requires_grad = False
    

      

     最后我们需要将需要优化的参数传入优化器,不需要传入的参数过滤掉,所以要用到filter()函数。

    optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.1)
    

      

    其它的博客中都没有讲解filter()函数的作用,在这里我简单讲一下有助于更好的理解。

    filter(function, iterable)

    • function: 判断函数
    • iterable: 可迭代对象

    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

    该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

    filter()函数将requires_grad = True的参数传入优化器进行反向传播,requires_grad = False的则被过滤掉。

  • 相关阅读:
    getWidth() 和 getMeasuredWidth()的区别
    解决 win7 注册com组件失败问题
    Documentation/PCI/pci-iov-howto.txt
    Android Migrate Android Code
    struts2 18拦截器详解(九)
    使用Maven模板创建项目
    转换基于Maven的Web应用程序支持Eclipse IDE
    转换基于Maven的Java项目支持Eclipse IDE
    Eclipse构建Maven项目
    NetBeans IDE集成Maven
  • 原文地址:https://www.cnblogs.com/daniumiqi/p/12175468.html
Copyright © 2011-2022 走看看