pytorch 一些关于模型参数冻结的问题

1.lambda表达式,又称匿名函数

作用:函数速写

语法:lambda arg : expression,解释:冒号前是参数,冒号后是返回值。

例子:

>>x=range(10)
>>lambda x:x%2==1

2.filter函数

参数:一个函数func和一个列表list

func的作用:对list的每个元素进行判断,符合条件返回true,否则返回false

filter根据判断结果自动过滤掉不符合条件的元素,并返回有符合元素组成的新列表

举例:

>>x=range(10)
>>filter(lambda x:x%2==1,x)
​
[1, 3, 5, 7, 9]

3.冻结一部分模型的参数中使用了上面两个函数:

# 模型准备
model = MyModel()
 
# 优化、正则项、权重设置与冻结层
 
for param in model.parameters():
    param.requires_grad = False
for param in model.add_block.parameters():
    param.requires_grad = True
 
optimizer = optim.SGD(
            filter(lambda p: p.requires_grad, model.parameters()),  # 记住一定要加上filter(),不然会报错
            lr=0.01,
            weight_decay=1e-5, momentum=0.9, nesterov=True)

参考:https://blog.csdn.net/jdzwanghao/article/details/83239111

集中分析下面这行代码

 filter(lambda p: p.requires_grad, model.parameters()),  # 记住一定要加上filter(),不然会报错

由上面第1个函数所知

lambda p: p.requires_grad 中,p是参数,而 p.requires_grad是返回值

结合第2个函数所知 filter(lambda p: p.requires_grad, model.parameters())中 lambda p: p.requires_grad就是以p为参数的满足p.requires_grad的true的条件的函数。而参数p赋值的元素从列表model.parameters()里取。所以只取param.requires_grad = True(模型参数的可导性是true的元素),就过滤掉为false的元素。

猜你喜欢

转载自blog.csdn.net/qq_36401512/article/details/105045157