Caffe-10-微调finetune-概念+操作步骤
文章目录
- 微调的概念
- win下caffe微调教程1
- 什么是finetune:
- finetune 与 scrachtch的区别
- scrachtch
- fine-tuning
- finetune怎么操作
- 准备数据集
- 计算数据集的mean文件
- 调整网络层参数
- 输入层的source 和 meanfile
- 最后一层输出层的类别数
- 最后一层改名
- 其他(不是必须的)
- lr
- 修改Solver参数
- test_iter
- base_lr
- (我自己加的)改deploy.prototxt参数
- 二 其他教程
- 准备数据
- 微调需要改的几个文件
- 训练
- 测试
- 共有几个文件
- cifar10_quick_train_test.prototxt
- cifar10_quick.prototxt
- Alexnet(或caffenet)微调的参数文件
- caffenet微调教程
自己识别车流过程中,暴露的问题:
之前是这样做的:只有“堵车”&“不堵车”两类训练样本。
根据cifar10的参数配置文件
cifar10_quick_solver.prototxt里的学习率、迭代次数等参数和
cifar10_quick_train_test.prototxt里的模型结构
作为训练的参数。
但由于自己的图片太少,只有1000张,最后识别率50%(无效),甚至出错。因此考虑用微调方式调参。
微调的概念
找到下面这篇blog:caffe的微调,下面是原文+笔记:
caffe团队用imagenet图片进行训练,迭代30多万次,训练出来一个model。这个model将图片分为1000类,应该是目前为止最好的图片分类model了。
假设我现在有一些自己的图片想进行分类,但样本量太小,可能只有几百张,而一般深度学习都要求样本量在1万以上,因此训练出来的model精度太低,根本用不上,那怎么办呢?
那就用caffe团队提供给我们的model吧。
因为训练好的model里面存放的就是一些参数,**因此我们实际上就是把别人预先训练好的参数,拿来作为我们的初始化参数,而不需要再去随机初始化了。**图片的整个训练过程,说白了就是将初始化参数不断更新到最优的参数的一个过程,既然这个过程别人已经帮我们做了,而且比我们做得更好,那为什么不用他们的成果呢?
使用别人训练好的参数,必须有一个前提,那就是必须和别人用同一个network,因为参数是根据network而来的。当然,最后一层,我们是可以修改的,因为我们的数据可能并没有1000类,而只有几类。我们把最后一层的输出类别改一下,然后把层的名称改一下就可以了。
最后用别人的参数(如w、b、卷积核等)、修改后的network结构和我们自己的数据,再进行训练,使得参数适应我们的数据,这样一个过程,通常称之为微调(fine tuning).
既然前两篇文章我们已经讲过使用digits来进行训练和可视化,这样一个神器怎么能不使用呢?因此本文以此工具为例,讲解整个微调训练过程。
win下caffe微调教程1
两个link:
win下caffe微调1
楼燚(yì)航的blog 也是完全按照上面一行链接做的,而且带图片,因此这两个链接其实是一样的。
下面是link1的节选+笔记:
##为什么finetune
小菜最近一直在学习caffe。今天小菜主要介绍一下如何在Caffe上微调网络(ps:小菜中间也出现了许多问题,不过很感谢网上的一些前辈的无私奉献),一般比较经典的深度学习模型是别人训练好的模型,例如分类模型主要是针对Imagenet的数据集进行分类的。为了适应我们自己特定的新任务(小菜的任务是分类),一般来说我们自己需要做的方向,比如在一些特定的领域的识别分类中,我们很难拿到大量的数据。因为像在ImageNet上毕竟是一个千万级的图像数据库,通常我们可能只能拿到几千张或者几万张某一特定领域的图像,比如识别衣服啊、标志啊、生物种类等等。在这种情况下重新训练一个新的网络是比较复杂的,而且参数不好调整,数据量也不够,因此fine-tuning微调就是一个比较理想的选择。
什么是finetune:
是在别人基于caffe训练好的模型(如caffenet,googlenet等)的基础上,利用别人训练好的模型的权重参数值,通过训练自己的图片集修改最后一层的(也就是softmax)的参数和输出类别,说白了就是网络层的前面层不变作为一个特征提取器,只改变最后一层作为一个分类器,最后的训练就相当于训练了一个适合自己需求的分类器。
finetune 与 scrachtch的区别
微调网络,通常我们有一个初始化的模型参数文件,这里是不同于training from scratch。
scrachtch
指的是我们训练一个新的网络,在训练过程中,这些参数都被随机初始化。
fine-tuning
是我们可以在ImageNet上1000类分类训练好的参数的基础上,根据我们的分类识别任务进行特定的微调。
finetune怎么操作
由于ImageNet的输出的分类数是1000,小菜用了6类的图像进行分类,所以最后的输出需要由1000改为6。
另外还需要将fc8层进行改名改为自己的名字(小菜改为fc8-test),这样因为已训练好的模型中没有与新的层进行匹配的结果,因此就会以新的随机值初始化最新创建的层。
小菜使用的网络模型是CaffeNet,是一个小型的网络,其实别的网络如GoogleNet也是一样的原理。那么这个任务的变化可以表示为:
任务:分类
类别数目:1000(ImageNet上1000类的分类任务)----->6(自己的特定数据集的分类任务)那么在网络的微调中,我们的整个流程分为以下几步:
Ø 准备好我们的训练数据和测试数据(lmdb格式),分为训练集和测试集;
Ø 计算数据集的均值文件;
Ø 修改网络结构;
Ø 调整Solver的配置参数,通常学习速率和步长,迭代次数都要适当减少,可以参考前面的solver的详解进行调整;
Ø 启动训练;
准备数据集
这一点就不用说了,准备两个txt文件,放成list的形式,可以参考caffe学习系列中数据集的生成。图像路径之后一个空格之后跟着类别的ID,如下,这里记住ID必须从0开始,要连续,否则会出错,loss不下降,按照要求写就OK。小菜找了6类一共是600张图片,480张为train,120张为test,放在caffe-master/data/re/train和caffe-master/data/re/test。生成图像对应的train.txt和test.txt,接着生成对应的lmdb数据,小菜把这些文件都放在caffe-master/examples/myfile路径下。这个是训练的图像label,测试的也同理。
这个需要拿到视频剪出的图像之后来做。
计算数据集的mean文件
因为集中特定领域的图像均值文件会跟ImageNet上比较General的数据的均值不太一样,生成的过程可以参考之前caffe生成均值文件的步骤。小菜最后生成的mean.binaryproto文件放在caffe-master/examples/myfile路径下。
这个需要拿到视频剪出的图像之后来做。
调整网络层参数
输入层的source 和 meanfile
参照Caffe上的例程,我用的是CaffeNet。(就在F:\caffe-master170309\models里)
首先在输入层data层,修改我们的source 和 meanfile, 根据之前生成的lmdb 和mean.binaryproto修改即可。
最后一层输出层的类别数
最后一层的输出类别,也就是将deploy.prototxt文件中的最后的输出类别1000改为自己的输出类别(小菜是改为6了)并且需要加快最后一层的参数学习速率。
最后一层改名
首先修改名字,这样预训练模型赋值的时候这里就会因为名字不匹配从而重新训练,也就达成了我们适应新任务的目的。原来是fc8,记得把跟fc8连接的名字都要修改掉。(把fc8全部改为了fc8_changename)
其他(不是必须的)
lr
调整学习速率,因为最后一层是重新学习,因此需要有更快的学习速率相比较其他层,因此我们将,weight和bias的学习速率加快10倍。(把fc8_changename层的lr_mult由1和2变为10和20)
#####crop_size
最后train_val里的crop_size还是设为了227(即没变):也就是输入的486的图片会被随机裁剪为227(crop_size的问题,不需要和原图一样大小)(crop_size的详细介绍)
修改Solver参数
可以参考前面的caffe学习系列中的solver的详解进行调整参数,原来的参数是用来training fromscratch,从原始数据进行训练的,因此一般来说学习速率、步长、迭代次数都比较大,在fine-tuning微调呢,也正如它的名字,只需要微微调整。
主要的调整有:
test_iter
从1000改为了100,因为数据量减少了
base_lr
从0.01变成了0.001,这个很重要,微调时的基本学习速率不能太大,学习策略没有改变,步长从原来的100000变成了20000,最大的迭代次数也从450000变成了50000
####动量和权重衰减项
都没有修改,依然是GPU模型,网络模型文件和快照的路径根据自己修改。
(我自己加的)改deploy.prototxt参数
在数据层是input_param {shape:{dim:10 dim:3 dim: 227 dim: 227}}, 改为input_param {shape:{dim:10 dim:1 dim:486 dim:486}}
其中10是指对待识别样本进行数据增广的数量。一般会进行5次crop,之后分别flip。一个样本会变成10个,之后输入到网络进行识别。如果不进行数据增广,可以设置成1。
link1 link2
因为测试时,图片是1个通道,486*486大小的。所以变为1、486、486
###找微调的模型
首先你要从caffe zoo里面下载一下CaffeNet网络用语ImageNet1000类分类训练好的模型文件,名字是bvlc_reference_caffenet.caffemodel,这个模型可以去网上下载:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
配置文件在caffe/models文件夹下,或者自己找
###开始训练
训练的命令如下:
Build/x64/Realse/caffe.exe train --solver=examples/myfile/solver.prototxt --weights examples/myfile/bvlc_refference_caffenet.caffemodel --gpu 0
小菜这里将它写成一个脚本文件(xxx.sh),在cygwin下直接运行该脚本文件就行,小菜也建议大家一开始的时候可以自己多手动敲的运行,这样可以加强你的熟悉程度,后面可以写成脚本,因为写成脚本很方便,运行的时候只需要敲一行代码就行。最后达到的性能还不错accuray 是0.9,loss降的很低,这是小菜的caffe微调的初次体验,希望能帮到大家!finetune时应该用自己的数据集生成的均值文件。
二 其他教程
finetune2 有两个prototxt代码(不过是原封不动没改过的)
caffenet finetune
linux caffe
##下载model参数
可以直接在浏览器里输入地址下载,也可以运行脚本文件下载。下载地址为:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
文件名称为:bvlc_reference_caffenet.caffemodel,文件大小为230M左右,为了代码的统一,将这个caffemodel文件下载到caffe根目录下的 models/bvlc_reference_caffenet/ 文件夹下面。
准备数据
如果有自己的数据最好,如果没有,可以下载我的练习数据:http://pan.baidu.com/s/1MotUe,下载后放在F:\caffe-master170309\data\MyFiveClass里,fe
这些数据共有500张图片,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。编号分别以3,4,5,6,7开头,各为一类。我从其中每类选出20张作为测试,其余80张作为训练。因此最终训练图片400张(放在train文件夹内,每个类一个子文件夹),测试图片100张(放在test文件夹内,每个类一个子文件夹)。
- 很详细的一篇介绍Alexnet和imagenet关系的文章,通俗的alexnet介绍了各层
微调需要改的几个文件
##原来自己cifar10微调的3个参数文件
原来自己用cifar10微调的时候:
训练
训练用的是cifar10_quick_solver.prototxt(里面学习率、迭代次数等参数,和cifar10_quick_train_test.prototxt)
其中上述包含的cifar10_quick_train_test.prototxt(里是网络结构,从lmdb的数据输入、均值文件、卷积层、池化层、内连接层、到最终的输出softmax层)
测试
测试(批处理即test_MyTrafficJam-255-255-png-lmdb.bat)里用的是cifar10_quick_train_test.prototxt
测试(单张图即Build/classification.bat)里用的是cifar10_quick.prototxt(里面是一个简化的网络结构【从数据层图像的维度、卷积层、池化层、内连接层、输出softmax层】应该是只用于测试的)
共有几个文件
####cifar10_quick_solver.prototxt
训练用 里面学习率、迭代次数等参数
cifar10_quick_train_test.prototxt
训练、测试批处理用 里是网络结构,从lmdb的数据输入、均值文件、卷积层、池化层、内连接层、到最终的输出softmax层
cifar10_quick.prototxt
测试单张图片用里面是一个简化的网络结构【从数据层图像的维度、卷积层、池化层、内连接层、输出softmax层】
Alexnet(或caffenet)微调的参数文件
在F:\caffe-master\models\bvlc_alexnet里有3个prototxt参数文件,其中:
solver.prototxt 训练用 里面学习率、迭代次数等参数
train_val.prototxt 训练、测试批处理用 里是网络结构,从lmdb的数据输入、均值文件、卷积层、池化层、内连接层、到最终的输出softmax层 (在其中data层,会根据train和test两个阶段有不同的效果)
deploy.prototxt 测试单张图片用里面是一个简化的网络结构【从数据层图像的维度、卷积层、池化层、内连接层、输出softmax层】
我如果用Alexnet微调的话:下面只需要
- 修改solver.prototxt,微调一些参数
- 修改train_val.prototxt,是最终输出2类即可(1000类-》2类)。
- 修改deploy.prototxt ,是最终输出2类即可(1000类-》2类)。因为我是要用单张图测试的,必须改这个适用于单张图的测试文件。
即可。
#配置文件的对应关系
cifar10模型和其他模型的文件的叫法不同,如下:
配置文件作用 | cifar10模型 | googlenet、caffenet、alexnet等模型 |
---|---|---|
训练用 里面学习率、迭代次数等参数 | cifar10_quick_solver.prototxt | solver.prototxt |
训练、测试批处理用 里用的网络结构(从lmdb的数据输入、均值文件、卷积层、池化层、内连接层、到最终的输出softmax层) | cifar10_quick_train_test.prototxt | train_val.prototxt |
测试单张图片用里面 用的一个简化的网络结构 | cifar10_quick.prototxt | deploy.prototxt |
caffenet微调教程
网上找了一篇,自己的256*256的图通过caffenet微调的文章
Caffe-10-微调finetune-概念+操作步骤相关推荐
- Ubuntu 14.04 64位机上用Caffe+MNIST训练Lenet网络操作步骤
1. 将终端定位到Caffe根目录: 2. 下载MNIST数据库并解压缩:$ ./data/mnist/get_mnist.sh 3. 将其转换成Lmdb数据库格式:$ ...
- 金蝶K3系统19年度增值税率调整(16改13,10改9)操作步骤
涉税基础资料变更: 1.物料 --step1--修改历史物料税率 --update t_ICItemMaterial set FTaxRate=13 where FTaxRate=16 --updat ...
- java调用caffe_Caffe中master与windows分支差异对比及通过命令提示符编译Caffe源码操作步骤...
目前GitHub https://github.com/fengbingchun/Caffe_Test 中的caffe还是依赖较老的版本,更新于2015.08.15,commit为09868ac,近 ...
- Windows7/10上配置OpenCV3.3.0-Python3.6.2操作步骤
目前OpenCV无论是2.4.x还是最新的3.3.0版本,默认支持的都是Python 2.7版本.这里介绍下如何使OpenCV 3.3.0支持Python 3.6.2的操作步骤: 1. 从 http ...
- Win7 + VirtualBox 安装 MacOS X 10.9 Mavericks 操作步骤
今天试着用 Win7 + VirtualBox 4.3 + MacOSx 10.6 + hdiutil + Mavericks.app.dmg 纯手工制作用于 VirtualBox 虚拟机安装的 Ma ...
- 使用acmesh免费开启https(详细概念介绍与操作步骤记录)
前言 记录一次使用acme.sh免费开启https的过程,前半部分列举一些用到的概念,后半部分记录具体操作步骤.文章已调整好线性阅读顺序,按顺序阅读即可.流程中涉及的概念会尽量进行讲解,以减少阅读此篇 ...
- 小米10 android11降级,MIUI11降级到MIUI10的操作步骤(米6)
MIUI11应该是MIUI系统里面最烂的一个了,没有之一,不接受反驳.除了特么耗电极快以外,系统卡顿,应用卡顿也都是出了名的,网上的抱怨声可谓此起彼伏,MIUI估计也是看到了,所以来个诚意作品MIUI ...
- Windows7/10上快速搭建Tesseract-OCR开发环境操作步骤
之前在https://blog.csdn.net/fengbingchun/article/details/51628957 中描述过如何在Windows上搭建Tesseract-OCR开发环境,那时 ...
- Ubuntu16.04下caffe CPU版的详细安装步骤
一.caffe简介 Caffe,是一个兼具表达性.速度和思维模块化的深度学习框架. 由伯克利人工智能研究小组和伯克利视觉和学习中心开发. 虽然其内核是用C++编写的,但Caffe有Python和Mat ...
最新文章
- 【网络流24题】解题报告:E 、圆桌问题(最大流求二分图多重匹配)
- iOS架构-静态库.framework(引用第三方SDK、开源库、资源包)(9)
- 阿里 双11 同款,流量防卫兵 Sentinel go 源码解读
- 系统集成资质 -考点分析- “三点估算法”出题的形式演化分析
- 一个简单的基于socket的通讯处理程序
- 判断整除(信息学奥赛一本通-T1195)
- 放之四海皆适用的设计原则(一)
- spring boot实战 静态资源处理
- 复杂网络分析软件NetworkX和UCINET数据关联的方法
- poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)
- 3D美术14——max——fbx导入max后直接生成bip人形骨骼插件
- linux 在固定网址yum,linux yum介绍
- 浅析软文标题写作的三个问题
- EXTJS记事本:当CompositeField遇上RowEditor
- 华为鲲鹏+银河麒麟v10 安装 docker-ce
- 《University Calculus》-chape12-偏导数-基本概念
- JavaBean 是什么?JavaBeans 概念介绍
- 学习MySQL-第六章
- og标签对SEO的作用及用法
- FOJ 2181 快来买肉松饼