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的元素。