首页 > 其他分享 >优化:微调Finetuning

优化:微调Finetuning

时间:2023-08-14 11:31:43浏览次数:36  
标签:Finetuning 训练 finetune 微调 参数 lr 优化 数据库


模型的微调   

  使用别人训练好的网络模型进行训练,前提是必须和别人用同一个网络,因为参数是根据网络而来的。当然最后一层是可以修改的,因为我们的数据可能并没有1000类,而只有几类。把最后一层的输出类别和层的名称改一下就可以了。用别人的参数、修改后的网络和自己的数据进行训练,使得参数适应自己的数据,这样一个过程,通常称之为微调(fine tuning). 

微调时候网络参数是否更新


  更新,finetune的过程相当于继续训练,跟直接训练的区别是初始化的时候: 

   a. 直接训练是按照网络定义指定的方式初始化(如高斯随机初始化) 


  b. finetune是用你已经有的参数文件来初始化(就是之前训练好的caffemodel)


caffe命令全解析


  


第二部分:微调参数调整示例

各类模型finetune示例

Caffe finetune Resnet-50


Caffe finetune googlenet


Caffe finetune FCN


Caffe finetune Alexnet

                 

优化:微调Finetuning_数据集

  • 参数调整注意

  • 首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的;
  • 调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍,目的是让非微调层学习更快;
  • finetune时将最后的全连接层的名字全部修改,需要根据自己数据集的类别数重新设置fc8层的output数;
  • 数据集的类别号从0开始,中间要连续,否则会造成意外的错误
  • 数据集记得打乱,不然很可能不收敛;
  • 如果出现不收敛的问题,可以把solver里的lr设的小一点,一般从0.01开始,如果出现loss=nan了就不断往小调整;
  • 可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了;
  • finetune时应该用自己的数据集生成的均值文件(是否正确?);

第三部分:fine-tune的选择经验

  在fine-tune时,究竟该选择哪种方式的Transfer Learning?需要考虑的因素有许多,其中最重要的两条是新数据库的规模和它与预训练数据库的相似程度,根据这两条因素的不同配置,存在四种场景: 
   
  新数据库小,和预训练数据库相似。因为数据库比较小,fine-tune的话可能会产生过拟合,比较好的做法是用预训练的网络作为特征提取器,然后训练线性分类器用在新的任务上。 
  新数据库比较大,和预训练数据库相似。这种情况下,不用担心过拟合,可以放心地微调整个网络。 
  新数据库小,和预训练数据库不相似。这时,既不能微调,用预训练网络去掉最后一层作为特征提取器也不合适,可行的方案是用预训练网络的前面几层的激活值作为特征,然后训练线性分类器。 
  新数据库大,和预训练数据库不相似。这时可以从头开始训练,也可以在预训练的基础上进行微调。

 
   
   
  综述:做freeze操作时,通常还会根据数据集在不同情况进行有选择的性的finetune。如small datasets时,可以freeze前面conv layer-> fc4086来提取cnn在imagenet上的多类泛化特征来辅助作为分类的feature,再对如这边revise的fc-20->softmax进行training。以此类推,如果是medium datasets则freeze到一半的conv。个人理解这样做的很大原因在于lower level layer具有更强泛化的basic feature,同时记得考量你的数据来选择。


第四部分:如何针对上述不同的方式进行网络参数固定

比如有4个全连接层A->B->C->D: 

  a. 你希望C层的参数不会改变,C前面的AB层的参数也不会改变,这种情况也就是D层的梯度不往前反向传播到D层的输入blob(也就是C层的输出blob 没有得到梯度),你可以通过设置D层的lr_mult: 0,layer的梯度就不会反向传播啦,前面的所有layer的参数也就不会改变了。 
  b. 你希望C层的参数不会改变,但是C前面的AB层的参数会改变,这种情况,只是固定了C层的参数,C层得到的梯度依然会反向传播给前面的B层。只需要将对应的参数blob的学习率调整为0: 

  在layer里面加上param { lr_mult: 0 }就可以了,比如全连接层里面:

layer {
    type: "InnerProduct"
    param { # 对应第1个参数blob的配置,也就是全连接层的参数矩阵的配置
         lr_mult: 0 # 学习率为0,其他参数可以看caffe.proto里面的ParamSpec这个类型
    }
    param { # 对应第2个参数blob的配置,也就是全连接层的偏置项的配置
        lr_mult: 0 # 学习率为0
    }
}



第五部分:Caffe fine-tune常见问题


一、按照网上的教程微调alexnet,为什么loss一直是87.3365?




  解决办法:检查数据集的标签是否是从0开始,base_lr调低了一个数量级,batch_size调高一倍。 
   
  出现的原因:87.3365是个很特殊的数字,NAN经过SoftmaxWithLoss就产生了这个数字,所以就是你的FC8输出全是NAN; 
   
  具体分析: 
  

二、Loss下降了,但是准确率没有明显变化?

 解决办法:训练前首先shuffle,其次学习率是否合适。

三、Data augmentation 的技巧总结

  • Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当);
  • PCA
  • Random Scale:尺度变换;
  • Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换;
  • Horizontal/Vertical Flip:水平/垂直翻转;
  • Shift:平移变换;
  • Rotation/Reflection:旋转/仿射变换;
  • Noise:高斯噪声、模糊处理;
  • Label shuffle:类别不平衡数据的增广,参见海康威视ILSVRC2016的report;另外,文中提出了一种Supervised 
# -*- coding: utf-8 -*-
__author__ = 'Administrator'

# import packages
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

datagen = ImageDataGenerator(
        rotation_range=0.2,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

img = load_img('C:\Users\Administrator\Desktop\dataA\lena.jpg')  # this is a PIL image, please replace to your own file path
x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)
x = x.reshape((1,) + x.shape)  # this is a Numpy array with shape (1, 3, 150, 150)

# the .flow() command below generates batches of randomly transformed images
# and saves the results to the `preview/` directory

i = 0
for batch in datagen.flow(x,
                          batch_size=1,
                          save_to_dir='C:\Users\Administrator\Desktop\dataA\pre',#生成后的图像保存路径
                          save_prefix='lena',
                          save_format='jpg'):
    i += 1
    if i > 20:
        break  # otherwise the generator would loop indefinitely

四、如何通过loss曲线判断网络训练的情况


  单独的 loss 曲线能提供的信息很少的,一般会结合测试机上的 accuracy 曲线来判断是否过拟合; 

  关键是要看你在测试集上的acc如何; 
  如果你的 learning_rate_policy 是 step 或者其他变化类型的话, loss 曲线可以帮助你选择一个比较合适的 stepsize;

五、finetune_net.bin不能用之后,用新的方法做finetune会出问题,怎么解决?


给最后那个InnerProduct层换个名字。


----------------------------------------------------------------------------------------------------------------

1. 准备新数据的数据库(如果需要用mean file,还要准备对应的新的mean file), 具体方法和图片转换lmdb方式一样。
2. 调整网络层参数:
将来训练的网络配置prototxt中的数据层source换成新数据的数据库。
调整学习率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快。
3. 修改solver参数
原来的数据是从原始数据开始训练的,因此一般来说学习速率、步长、迭代次数都比较大,fine turning微调时,因为数据量可能减少了,所以一般来说,test_iter,base_lr,stepsize都要变小一点,其他的策略可以保持不变。
4. 重新训练时,要指定之前的权值文件:

# caffe train --solver [新的solver文件] --weights  [旧的caffemodel]




标签:Finetuning,训练,finetune,微调,参数,lr,优化,数据库
From: https://blog.51cto.com/u_12667998/7074522

相关文章

  • 【Tensorflow】深度模型推理性能优化-微量优化
    序说到深度模型优化,可能想到最多的就是上GPU,对于CV、NLP这一类模型效果非常明显,一般RT能下降到原来的1/10。但是在实际中,会遇到一些排序类的模型例如推荐模型DSMM、ESMM、DIN等模型,这些模型深度一般只有4、5层,上GPU后性能、RT反而下降,猜测原因可能是模型网络简单,导致反复IO,最终......
  • SAM-U升级SAM | 带你分析SAM的弱点并重新优化设计填补空缺
    前言 最近,SAM向通用人工智能迈出了重要的一步。同时,它的可靠性和公平性也引起了人们的极大关注,尤其是在医疗保健领域。在这项研究中,作者提出了SAM线索的Multi-box即时触发不确定性估计,以证明分割病变或组织的可靠性。作者使用具有先验分布参数的蒙特卡罗来估计SAM预测的分布,使......
  • System.currentTimeMillis()高并发性能优化
    摘要:System.currentTimeMillis()性能问题的研究、测试与优化。  性能优化使用的测试环境:jdk版本jdk8  操作系统:macOS版本:13.2.1芯片:AppleM1CPU核数:8核  System.currentTimeMillis()是Java极其常用的API,广泛地用来获取时间戳或统计代码执行耗时等,在我们的......
  • 拓端tecdat|R语言实现k-means聚类优化的分层抽样(Stratified Sampling)分析各市镇的人
    最近我们被客户要求撰写关于k-means聚类的研究报告,包括一些图形和统计输出。简介假设我们需要设计一个抽样调查,有一个完整的框架,包含目标人群的信息(识别信息和辅助信息)。如果我们的样本设计是分层的,我们需要选择如何在总体中形成分层,以便从现有的辅助信息中获得最大的优势。换句话......
  • sql优化
    sql优化参考博客:SQL优化的几种方法常见的SQL优化方法sql优化的N种方法_持续更新史上最全SQL优化方案sql语句用大写解析sql语句时,把小写的字母转换成大写的再执行对查询进行优化,应尽量避免全表扫描,首先考虑在where及orderby上建立索引。应尽量避免在where子句中进行以......
  • 斜率优化DP
    前置芝士单调队列优化DP⌈写不动数据结构呜呜呜,先来补这个⌋对于一个DP,我们想优化祂的⌈转移⌋有些题目的可选状态有以下特征需要寻找最值可选状态区间平移存在可以永久去除的多余状态感性的讲,可行性是一个滑动窗口,状态两两之间都可以⌈直接比较出优劣......
  • 如何用随机方法求解组合优化问题(一)
    什么是组合优化问题定义优化问题设\(x\)是决策变量,\(D\)是\(x\)的定义域,\(f(x)\)是指标函数,\(g(x)\)是约束条件。则优化问题可以表示为求解满足\(g(x)\)的\(f(x)\)最小值问题。即:\[\min_{x\inD}(f(x)|g(x))\]组合优化问题如果在定义域\(D\)上,满足约束条件......
  • 【BP回归预测】基于粒子群算法优化BP神经网络实现数据回归预测附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 国标GB28181视频平台LntonGBS(源码版)国标视频平台在网络不稳定的强况下重复申请视频拉
    LntonGBS是基于国标GB28181协议的视频云服务平台,支持将国标协议的设备统一接入并进行集中管理。平台具备优秀的视频能力,包括视频监控直播、录像、云存储、回放、平台级联、语音对讲、智能告警等功能,在线下场景中已有大量落地应用。我们在项目测试中发现,LntonGBS通过web页面请求拉流......
  • RTMP流媒体服务器LntonMedia(免费版)视频直播点播平台采用Golang指针问题导致平台重复推
    我们的团队在研发视频流媒体平台时,广泛应用了Go语言。之前我们也与大家交流过关于Go语言指针的问题和应用。如果你对视频流媒体平台编译中如何运用Go语言指针感兴趣,可以了解一下我们的讨论。在对LntonMedia的编译中,我们发现Golang指针问题会导致系统内的重复推流。Golang遍历切片代......