文章目录

  • 微调的概念
  • 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文件夹内,每个类一个子文件夹)。

  1. 很详细的一篇介绍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微调的话:下面只需要

  1. 修改solver.prototxt,微调一些参数
  2. 修改train_val.prototxt,是最终输出2类即可(1000类-》2类)。
  3. 修改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-概念+操作步骤相关推荐

  1. Ubuntu 14.04 64位机上用Caffe+MNIST训练Lenet网络操作步骤

    1.      将终端定位到Caffe根目录: 2.      下载MNIST数据库并解压缩:$ ./data/mnist/get_mnist.sh 3.      将其转换成Lmdb数据库格式:$ ...

  2. 金蝶K3系统19年度增值税率调整(16改13,10改9)操作步骤

    涉税基础资料变更: 1.物料 --step1--修改历史物料税率 --update t_ICItemMaterial set FTaxRate=13 where FTaxRate=16 --updat ...

  3. java调用caffe_Caffe中master与windows分支差异对比及通过命令提示符编译Caffe源码操作步骤...

    目前GitHub https://github.com/fengbingchun/Caffe_Test  中的caffe还是依赖较老的版本,更新于2015.08.15,commit为09868ac,近 ...

  4. 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 ...

  5. Win7 + VirtualBox 安装 MacOS X 10.9 Mavericks 操作步骤

    今天试着用 Win7 + VirtualBox 4.3 + MacOSx 10.6 + hdiutil + Mavericks.app.dmg 纯手工制作用于 VirtualBox 虚拟机安装的 Ma ...

  6. 使用acmesh免费开启https(详细概念介绍与操作步骤记录)

    前言 记录一次使用acme.sh免费开启https的过程,前半部分列举一些用到的概念,后半部分记录具体操作步骤.文章已调整好线性阅读顺序,按顺序阅读即可.流程中涉及的概念会尽量进行讲解,以减少阅读此篇 ...

  7. 小米10 android11降级,MIUI11降级到MIUI10的操作步骤(米6)

    MIUI11应该是MIUI系统里面最烂的一个了,没有之一,不接受反驳.除了特么耗电极快以外,系统卡顿,应用卡顿也都是出了名的,网上的抱怨声可谓此起彼伏,MIUI估计也是看到了,所以来个诚意作品MIUI ...

  8. Windows7/10上快速搭建Tesseract-OCR开发环境操作步骤

    之前在https://blog.csdn.net/fengbingchun/article/details/51628957 中描述过如何在Windows上搭建Tesseract-OCR开发环境,那时 ...

  9. Ubuntu16.04下caffe CPU版的详细安装步骤

    一.caffe简介 Caffe,是一个兼具表达性.速度和思维模块化的深度学习框架. 由伯克利人工智能研究小组和伯克利视觉和学习中心开发. 虽然其内核是用C++编写的,但Caffe有Python和Mat ...

最新文章

  1. 【网络流24题】解题报告:E 、圆桌问题(最大流求二分图多重匹配)
  2. iOS架构-静态库.framework(引用第三方SDK、开源库、资源包)(9)
  3. 阿里 双11 同款,流量防卫兵 Sentinel go 源码解读
  4. 系统集成资质 -考点分析- “三点估算法”出题的形式演化分析
  5. 一个简单的基于socket的通讯处理程序
  6. 判断整除(信息学奥赛一本通-T1195)
  7. 放之四海皆适用的设计原则(一)
  8. spring boot实战 静态资源处理
  9. 复杂网络分析软件NetworkX和UCINET数据关联的方法
  10. poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)
  11. 3D美术14——max——fbx导入max后直接生成bip人形骨骼插件
  12. linux 在固定网址yum,linux yum介绍
  13. 浅析软文标题写作的三个问题
  14. EXTJS记事本:当CompositeField遇上RowEditor
  15. 华为鲲鹏+银河麒麟v10 安装 docker-ce
  16. 《University Calculus》-chape12-偏导数-基本概念
  17. JavaBean 是什么?JavaBeans 概念介绍
  18. 学习MySQL-第六章
  19. og标签对SEO的作用及用法
  20. FOJ 2181 快来买肉松饼

热门文章

  1. 美媒称苹果iPhone已成为无线运营商梦魇
  2. 【Web】CSS(No.32)Css页面布局经典案例(二)《云道商城首页》
  3. oracle 计算年累计,ORACLE计算累计和
  4. 以太网交换机的自学习功能
  5. 求一个图书管理系统程序
  6. 54张扑克牌,两人轮流拿牌问题
  7. Spring事务原理
  8. 复杂网络论文解析——《Finding Patient Zero:Learning Contagion Source with Graph Neural Networks》
  9. 手把手带你从0-1搭建网易云音乐项目!大厂经验有了!
  10. Web性能的几个常见瓶颈