PyTorch参数初始化和Finetune
来源:互联网 发布:linux循环语句实例 编辑:程序博客网 时间:2024/06/05 15:33
前言
这篇文章算是论坛PyTorch Forums关于参数初始化和finetune的总结,也是我在写代码中用的算是“最佳实践”吧。最后希望大家没事多逛逛论坛,有很多高质量的回答。
参数初始化
参数的初始化其实就是对参数赋值。而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了data,grad等借口,这就意味着我们可以直接对这些参数进行操作赋值了。这就是PyTorch简洁高效所在。
所以我们可以进行如下操作进行初始化,当然其实有其他的方法,但是这种方法是PyTorch作者所推崇的:
def weight_init(m):# 使用isinstance来判断m属于什么类型 if isinstance(m, nn.Conv2d): n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels m.weight.data.normal_(0, math.sqrt(2. / n)) elif isinstance(m, nn.BatchNorm2d):# m中的weight,bias其实都是Variable,为了能学习参数以及后向传播 m.weight.data.fill_(1) m.bias.data.zero_()
Finetune
往往在加载了预训练模型的参数之后,我们需要finetune模型,可以使用不同的方式finetune。
局部微调
有时候我们加载了训练模型后,只想调节最后的几层,其他层不训练。其实不训练也就意味着不进行梯度计算,PyTorch中提供的requires_grad使得对训练的控制变得非常简单。
model = torchvision.models.resnet18(pretrained=True)for param in model.parameters(): param.requires_grad = False# 替换最后的全连接层, 改为训练100类# 新构造的模块的参数默认requires_grad为Truemodel.fc = nn.Linear(512, 100)# 只优化最后的分类层optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
全局微调
有时候我们需要对全局都进行finetune,只不过我们希望改换过的层和其他层的学习速率不一样,这时候我们可以把其他层和新层在optimizer中单独赋予不同的学习速率。比如:
ignored_params = list(map(id, model.fc.parameters()))base_params = filter(lambda p: id(p) not in ignored_params, model.parameters())optimizer = torch.optim.SGD([ {'params': base_params}, {'params': model.fc.parameters(), 'lr': 1e-3} ], lr=1e-2, momentum=0.9)
其中base_params使用1e-3来训练,model.fc.parameters使用1e-2来训练,momentum是二者共有的。
0 0
- PyTorch参数初始化和Finetune
- PyTorch参数初始化和Finetune
- PyTorch 参数初始化
- PyTorch参数初始化方法
- pytorch finetune模型
- Pytorch框架下Finetune注意点
- PyTorch学习系列(九)——参数_初始化
- servlet初始化参数和上下文初始化参数
- alexnet tensorflow finetune实现和简介
- 迁移学习和finetune的区别
- silverLight 获取初始化参数和网页参数
- 第五章.初始化和清理 初始化可变参数列表
- SDRAM工作原理和初始化参数
- load-on-startup和初始化参数获得
- Oracle 初始化参数文件pfile和spfile
- 不能初始化泛型参数和数组
- Servlet和JSP初始化参数小结
- Oracle初始化参数文件spfile 和 pfile
- 源代码编译安装nginx续——程序的系统化
- 《响应式Web设计-HTML5和CSS3实战》阅读笔记第六章
- tomcat keepAliveTimeout=0问题
- 在linux命令下如何访问一个url
- Win32 SDK基础(11)—— 消息队列和GetMessage/PeekMessage、SendMessage/Postmesage
- PyTorch参数初始化和Finetune
- Linux进程间通信——使用消息队列
- 四轴pid调试心得
- Lightoj1174——Commandos(双向最短路)
- 树莓派 玩起来(四)Raspberry pi 安装中文支持及输入法
- 自动求导机制
- iOS企业版应用,Provisioning Profile文件即将过期怎么办?
- mysql直接导出查询数据到文本
- 深入学习Android系统上mount命令的使用