首页 > 其他分享 >迁移学习与ResNet

迁移学习与ResNet

时间:2023-09-27 15:33:34浏览次数:64  
标签:32 残差 ResNet 网络 学习 模块 迁移

一、迁移学习

  深度学习中,迁移学习可以让小样本学习得更好,省时,方便。eg:我们采用YOLOV5训练识别动物(假定是简单得二分类),那么我们可以使用作者基于coco数据集训练得所得权重文件weight1;在此基础上,训练我们的数据,即:使用我们的数据对weight1接着调整,直到weight1适应于我们的数据。

  总所周知,VGG、ResNet都是经典、可靠的经典网络模型,很多新的DL网络模型都是将其作为BackBone,接着后续进行创新开发,得到新的网络模型。一般地,迁移学习有两种方案:

  • (从头做起)使用原模型参数p,在新的网络中,p作为初始化用,反向传播的时候,更新所有参数。
  • (站在巨人肩膀上)使用原模型参数p,在新的网络中,将原来模型参数进行冻结,反向传播只更新后半部模型参数。

  (一般地,如果我们数据量大,冻结的层数越少;数据量小,冻结的层数越多。)

  注:例如ResNet的FC是100分类,而我们使用其进行迁移学习的时候,可能是10分类,这时候FC需要我们进行修改。

顺便科普:

      参数量:

MobileNet:   6百万不到

YOLO5S:     7百万

VGG-16:      4000万

RestNet:      1.3亿

 

二、ResNet

2.1、restnet基本原理

  理论上,56层网络的拟合能力远远强于20层,如下图(老图),20层的网络反而loss比56的低,原因是:随着网络加深,容易过拟合。

   残差链接可以解决上述过拟合问题。例如:网络第n层输出为x,如下图,x现在走两条路,一条直接通过identity进行通过同等映射(直接copy下去);另一条经过两个权重层处理。对比上述两条路结果的loss,哪个小就在网络中保留哪一个(其实不是绝对保留,两条路都有权重系数的,可取原文看公式)。

 

   但是残差链接可能有个问题,如下图,34-层的残差网络中,有个虚线残差连接,我们注意到1->2过程中,特征图的channel由64->128,通过正常卷积层是这样,那残差连接是怎么解决的呢?答案是:通过1×1卷积进行升维度。

 

   以下是两个常规网络,一个34层,一个18层,左图中可以看到,34层网络由于过拟合,效果反而不如18层网络;有图中我们给两者都加上残差连接后,34层网络才变得更好。

 2.2 基于resnet的迁移学习

   这里为了说明问题,选择层数比较小,stage1、2、3、4、5,5个模块(迁移学习会采用官方预训练模型,但是官方是1000分类,咱们是10分类,所以咱们需要修改下图的AVG POOL-Flatten-FC的size,其余前面模块直接复制官方参数,并冻结),请注意蓝色conv block模块、ID block 模块,下文简称c模块、i模块。

i模块:对应上图 34-layer residual中的 实线模块。

c模块:对应......虚线模块。

 

  如下图所示:I模块(同等银色)在a、b汇合处相加,由于特征图尺寸一致,可以直接相加;再看C模块,在d处,特征图大小变为32×32×128,而原来特征图为

32×32×64,他们channel维度不同,原本是不能直接相加,但是在跳远连接(shortup过程)有个1×1卷积,它可以升高维度,处理后特征图变为32×32×128,这时候c

、d两处的特征图就可以相加了(这里加法其实是带权重的加法)。

  效果怎样自己看吧,下图左边是迁移学习的效果,右边是自己重新训练的效果。

 

 结论:迁移学习,使用官方权重进行预训练,模型收敛快!一般不建议冻住!

 

 

 

 

 

 

Reference:

[1]  https://arxiv.org/pdf/1512.03385.pdf   《Deep Residual Learning for Image Recognition》

 

标签:32,残差,ResNet,网络,学习,模块,迁移
From: https://www.cnblogs.com/feiyull/p/14540155.html

相关文章

  • Linux2.1.13网络源代码学习(https://qiankunli.github.io/2022/07/04/linux_2_1_13_ne
    简介简介源码目录网络分层数据结构套接字套接字与vfssk_buff结构网络协议栈实现——数据struct和协议structlinux1.2.13接收数据收到数据包的几种情况Socket读取发送数据面向过程/对象/ioc以下来自linux1.2.13源码,算是参见Linux1.0的学习笔记。源码目......
  • 【从0学习Solidity】14. 抽象合约和接口
    【从0学习Solidity】14.抽象合约和接口博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于......
  • 【从0学习Solidity】13. 继承
    【从0学习Solidity】13.继承博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代码没......
  • 【从0学习Solidity】12. 事件
    【从0学习Solidity】12.事件博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代码没......
  • 【从0学习Solidity】 10. 控制流,用solidity实现插入排序
    【从0学习Solidity】10.控制流,用solidity实现插入排序博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和......
  • 【从0学习Solidity】9. 常数 constant和immutable
    【从0学习Solidity】9.常数constant和immutable博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本......
  • 【从0学习Solidity】 8. 变量初始值
    【从0学习Solidity】8.变量初始值博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写......
  • 【从0学习Solidity】7. 映射类型 mapping
    【从0学习Solidity】7.映射类型mapping博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于......
  • 【从0学习Solidity】 4. 函数输出
    【从0学习Solidity】4.函数输出博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代......
  • 【从0学习Solidity】 6. 引用类型, array, struct
    【从0学习Solidity】6.引用类型,array,struct博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本......