之一:
torchvision 中包含了很多预训练好的模型,这样就使得 fine-tune 非常容易。本文主要介绍如何 fine-tune torchvision 中预训练好的模型。
安装
?
1 |
|
如何 fine-tune
以 resnet18 为例:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
为什么
这里介绍下 运行resnet_model.fc= nn.Linear(in_features=..., out_features=100)时 框架内发生了什么
这时应该看 nn.Module 源码的 __setattr__ 部分,因为 setattr 时都会调用这个方法:
?
1 2 3 4 5 |
|
首先映入眼帘就是 remove_from 这个函数,这个函数的目的就是,如果出现了 同名的属性,就将旧的属性移除。 用刚才举的例子就是:
预训练的模型中 有个 名字叫fc 的 Module。
在类定义外,我们 将另一个 Module 重新 赋值给了 fc。
类定义内的 fc 对应的 Module 就会从 模型中 删除。
之二:
前言
这篇文章算是论坛PyTorch Forums关于参数初始化和finetune的总结,也是我在写代码中用的算是“最佳实践”吧。最后希望大家没事多逛逛论坛,有很多高质量的回答。
参数初始化
参数的初始化其实就是对参数赋值。而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了data,grad等借口,这就意味着我们可以直接对这些参数进行操作赋值了。这就是PyTorch简洁高效所在。
所以我们可以进行如下操作进行初始化,当然其实有其他的方法,但是这种方法是PyTorch作者所推崇的:
?
1 2 3 4 5 6 7 8 9 |
|
Finetune
往往在加载了预训练模型的参数之后,我们需要finetune模型,可以使用不同的方式finetune。
局部微调
有时候我们加载了训练模型后,只想调节最后的几层,其他层不训练。其实不训练也就意味着不进行梯度计算,PyTorch中提供的requires_grad使得对训练的控制变得非常简单。
?
1 2 3 4 5 6 7 8 9 |
|
全局微调
有时候我们需要对全局都进行finetune,只不过我们希望改换过的层和其他层的学习速率不一样,这时候我们可以把其他层和新层在optimizer中单独赋予不同的学习速率。比如:
?
1 2 3 4 5 6 7 8 |
|
其中base_params使用1e-3来训练,model.fc.parameters使用1e-2来训练,momentum是二者共有的。
之三:
pytorch finetune模型
文章主要讲述如何在pytorch上读取以往训练的模型参数,在模型的名字已经变更的情况下又如何读取模型的部分参数等。
pytorch 模型的存储与读取
其中在模型的保存过程有存储模型和参数一起的也有单独存储模型参数的
单独存储模型参数
存储时使用:
?
1 |
|
读取时:
?
1 2 |
|
存储模型与参数
存储:
?
1 |
|
读取:
?
1 |
|
模型的参数
fine-tune的过程是读取原有模型的参数,但是由于模型的所要处理的数据集不同,最后的一层class的总数不同,所以需要修改模型的最后一层,这样模型读取的参数,和在大数据集上训练好下载的模型参数在形式上不一样。需要我们自己去写函数读取参数。
pytorch模型参数的形式
模型的参数是以字典的形式存储的。
?
1 2 3 |
|
即可看到所有的键值
如果想修改模型的参数,给相应的键值赋值即可
?
1 |
|
最后更新模型的参数
?
1 |
|
如果模型的key值和在大数据集上训练时的key值是一样的
我们可以通过下列算法进行读取模型
?
1 2 3 4 5 6 7 8 9 10 11 |
|
如果模型的key值和在大数据集上训练时的key值是不一样的,但是顺序是一样的
?
1 2 3 4 5 6 7 8 9 10 11 12 |
|
如果模型的key值和在大数据集上训练时的key值是不一样的,但是顺序是也不一样的
自己找对应关系,一个key对应一个key的赋值
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Scythe666/article/details/82809615
本文链接:https://my.lmcjl.com/post/16143.html
4 评论