• 深度学习——(6)pytorch冻结某些层的参数


    深度学习——(6)pytorch冻结某些层的参数


    在加载预训练模型的时候,有时候想冻结前面几层,使其参数在训练过程中不发生变化(不进行反向传播)

    问题出现

    在之前的blog——VGG16 图像分类中,使用如下语法

    net = vgg(model_name=model_name, num_classes=1000,init_weights=True) # 没有训练好的权重,需要加载ImageNet的权重
    net.load_state_dict(torch.load(pre_path, map_location=device))
    for parameter in net.parameters():
            parameter.required_grad = False
    
    • 1
    • 2
    • 3
    • 4

    注:上面语句的含义我的理解是将所有的层都冻结
    但是,出现了一个神奇的问题,当我打印每一层是否已经冻结,所有层的require_grad都显示为True。**在这里插入图片描述
    这,这不就是意思把真个model已知都在反向传播吗??那我加载权重干什么??为了一探究竟,所以做了下面的尝试,想看看到底这个required_grad是怎么一回事?

    一探究竟

    try 1. 不加required_grad

    当不加required_grad的时候(上面代码不加后面两行),默认required_grad=True,训练时候的loss值应该会很大,看看结果如何
    在这里插入图片描述
    确实很大!!!

    try 2. 使用原来的格式更改(上面提到的)

    如果使用前面提到的,那应该所有的参数都被冻结了,loss应该不会像上面那么大了,但是打印每一层的grad依然显示True。——反正就神奇!

    for parameter in net.parameters(): #required_grad==False 才不会反向传播,只训练下面部分(微调)
            parameter.required_grad = False
    for name, value in net.named_parameters():
            print('name: {0},\t grad: {1}'.format(name, value.requires_grad)) 
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    在这里插入图片描述

    try 3. 定义no_grad列表将部分层冻结

    这才是我的初衷,师兄也和我说先冻结前面的层,对后面的分类进行整体学习,然后放开全局进行微调。所以我的意愿是先冻结feature层进行学习。

    no_grad = ['features.0.weight','features.0.bias',
               'features.2.weight','features.2.bias',
               'features.5.weight','features.5.bias',
               'features.7.weight','features.7.bias',
               'features.10.weight','features.10.bias',
               'features.12.weight','features.12.bias',
               'features.14.weight','features.14.bias',
               'features.17.weight','features.17.bias',
               'features.19.weight','features.19.bias',
               'features.21.weight','features.21.bias',
               'features.24.weight','features.24.bias',
               'features.26.weight','features.26.bias',
               'features.28.weight','features.28.bias'              
               ]
    for name, value in net.named_parameters():
         if name in no_grad:
              value.requires_grad = False
         else:
              value.requires_grad = True
         print('name: {0},\t grad: {1}'.format(name, value.requires_grad))   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述
    在这里插入图片描述
    具体为什么还在和师兄讨论,真正明晰了继续更。也请知道原因的大家帮我解答疑惑,欢迎致电2535227524@qq.com

  • 相关阅读:
    React报错之Unexpected default export of anonymous function
    npm install 卡在reify:rxjs: timing reifyNode的解决办法
    Python generator高级方法应用解析
    Java,自从看了你一眼,就再也无法忘怀
    [模版总结] - 树的基本算法3 - 结构转化
    【自然语言处理三-自注意self attention】
    (74)MIPI DSI LLP介绍(十四)
    Java设计模式七大原则-里氏替换原则
    vue实现列表数据分页
    CANoe.Diva生成测试用例
  • 原文地址:https://blog.csdn.net/qq_43368987/article/details/125894302