有时候训练模型肯定是需要optim对吧,但是很多情况下,我一个模型,有encoder,有dense等等不同层构成的,而每一层、每一种模型我都想要用不同的学习率,该怎么办?

torch.optim就给我们提供了一个很好的接口,先看看doc:

比方说这是Adam的参数要求,后面这些lr、beta、weight_decay啥的先不去看他,就先看params这个参数:
params:iterable of parameters to optimize or dicts defining parameter groups
需要被优化的可迭代模型参数对象或者一个定义了所有parameter groups的dict

也就是params不仅可以传model.parameters(),还可以传一个字典,这就可以让我们很灵活地设置参数了,比方说像这样:

params = []
for name, param in self._encoder.named_parameters():if param.requires_grad == True:if "weight" in name:params += [{"params": param, "lr": self._learning_rate, "weight_decay": self._weight_decay}]elif "bias" in name:params += [{"params": param, "lr": self._learning_rate}]
params += [{"params": list(dense_layer.parameters())[0], "lr": self._learning_rate * 10,"weight_decay": self._weight_decay}]
params += [{"params": list(dense_layer.parameters())[1], "lr": self._learning_rate * 10}]
# each task has it's own optimizer
optimizer = Adam(params)

可以看到我设置所有weight有weight_decay,而bias的为0。同时,我的dense层lr是encoder层的10倍。然后把这个dict,也就是parameter groups传给了Adam.

或者再pythonic点吧,和上面的写法一样的效果:

named_params = {name:param for name,param in self.named_parameters() if param.requires_grad == True}
no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']
params = []
params += [{"params":[p for n,p in named_params.items() if not any([nd in n for nd in no_decay])],"weight_decay":0.01}]
params += [{"params":[p for n, p in named_params.items() if any(nd in n for nd in no_decay)],"weight_decay":0.0}]optimizer = Adam(params)

pytorch optim灵活传参相关推荐

  1. 【Python】「argparse基本用法」及「jupyter中使用 args = parser.parse_args()并传参」

    主要是对该项目dgl/examples/pytorch/metapath2vec at master · dmlc/dgl · GitHub中代码的理解. 对于metapath2vec.py文件内容: ...

  2. shell脚本的命令行传参

    在Linux环境下开发C程序,若想要可选择性的给程序传递外部参数,最后是以启动脚本的形式间接进行传递,这样对于命令行的参数解析工作将集中到shell脚本中,大大增加C代码的可移植性.       sh ...

  3. 回调函数自定义传参_koroFileHeader:一个用于生成文件头部注释和函数注释的插件...

    小金子 读完需要 2分钟 速读仅需 1 分钟 大家好,我是你们的小金子. 今天给大家分享的这个工具呢?对于使用 VS Code 的同学来讲,是一个好东西. koroFileHeader,一个在 vsc ...

  4. python解包裹_关于Python中包裹传参和解包裹的理解

    原标题:关于Python中包裹传参和解包裹的理解 1.包裹传参 首先思考一个问题:为什么要有包裹传参?原因包括但不仅限于以下两点:①不确定参数的个数.②希望函数定义的更加松散灵活 包裹传参分两种:包裹 ...

  5. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    看这边文章时的疑惑是:WebApi中的参数加了[FromBody],不知所以然,就百度了下,看到了以下文章,和大家分享下: 原文链接:http://www.cnblogs.com/landeanfen ...

  6. python可变参数_Python 的四种共享传参详解

    点击上方"Python数据之道",选择"星标公众号" 精品文章,第一时间送达 作者 | 杨仁聪 编辑 | Lemon 出品 | Python数据之道 本文来自公 ...

  7. 点击事件调用匿名函数如何传参_事件发布/订阅模式的简单实现

    这是一种广泛应用于异步编程的模式,是回调函数的事件化,常常用来解耦业务逻辑.事件的发布者无需关注订阅的侦听器如何实现业务逻辑,甚至不用关注有多少个侦听器存在.数据通过消息的方式可以灵活的传递. --& ...

  8. 获取map第一个的key和value_谁要是再敢用Map传参,我过去就是一JIO

    还记得上次我写过一篇关于实际项目代码分层和规划的文章<看完这篇,别人的开源项目结构应该能看懂了>, 在文尾处提到过一些注意事项,其中第一条就是: Contorller层参数传递建议不要使用 ...

  9. 『Python × C++』函数传参机制学习以及对比

    一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么 ...

  10. WebApi 接口参数不再困惑:传参详解

    阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4."怪异"的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4 ...

最新文章

  1. 背包系列 hdu3449 有依赖背包
  2. lighttpd缓存配置
  3. 【正一专栏】故意豪宅纵火的保姆会判死刑吗?
  4. poj 3020 Antenna Placement(二分图最大匹配)
  5. mysql 双节点主从搭建_MySQL Replication, 主从和双主配置
  6. VS工程中混有.c文件时出现fatal error C1853错误
  7. JavaScript学习笔记3--文本框获得焦点,文本框里提示信息自动消失
  8. PHP将图片剪切成圆形
  9. 淘宝购物流程图 基本流和备选流以及测试用例
  10. 使用Elasticsearch做向量空间内的相似性搜索
  11. 【win10专业版】win10系统下Office2013无法激活的解决方法
  12. MCE | 靶向 cGAS-STING 通路或可治疗渐冻症
  13. [大数据面试]--智力题(2)
  14. 微信小程序期末大作业 记单词小程序 适合初学者学习使用
  15. 【ES实战】在Linux下 CentOS 7离线安装Rally2.7.0
  16. android v4l2 4路视频,美菲特4路HDMI视频采集卡
  17. Linux-Centos7搭建k8s前系统配置项
  18. 宿主机到虚拟机的端口映射
  19. linux 7 iscsi 配置,RHEL7使用targetcli配置iSCSI
  20. Postgresql 全文检索测试

热门文章

  1. 常见动词的过去式和过去分词
  2. Incompatible magic value xxxxxx in class file
  3. 计算机四级数据库工程师考什么,计算机四级《数据库工程师》考试大纲
  4. K3 CLOUD计划方案-集中计划与协同计划的区别
  5. 苹果电脑上几款不错的图片浏览管理工具
  6. deepface:最先进轻量级人脸识别和人脸属性分析框架讲解
  7. AST实战|某CloudFlare 5秒盾第一层混淆代码一键还原思路分享
  8. 伍斯特理工学院计算机科学硕士,2020年伍斯特理工学院排名TFE Times美国最佳计算机科学硕士专业排名第100...
  9. java启动另一个程序_Java操作另一个Java程序使其重启的简单实现
  10. 2021年,中国程序员前景一片灰暗,真的是这样吗?