在经过前面Caffe框架的搭建以及caffe基本框架的了解之后,接下来就要回到正题:使用caffe来进行模型的训练。

但如果对caffe并不是特别熟悉的话,从头开始训练一个模型会花费很多时间和精力,需要对整个caffe框架有一个很清楚的了解,难度比较高;同时,在使用数据迭代训练自己模型时会耗费很多计算资源。对于单GPU或者没有大的GPU计算能力的研究者会比较困难。所以,使用已经训练好的caffe模型来进行finetuning就会是一个比较好的选择。

一来,finetuning的过程和训练的过程步骤大体相同,因此在finetuning的过程中可以对caffe训练过程有一个详细的了解,通过一步步的训练和finetuning,在寻找最优参数过程中加深对caffe框架的理解,为自己后续自己从头开始训练一个caffe深度网络模型打好基础。

另外,finetuning需要的计算资源相对较少,使用的trikes相对较少,难度较低,比较适合caffe新手。在finetuning过程中熟悉caffe的各种接口和操作。

话不多少,进入正题:使用caffe进行finetuing

在finetuning之前,我们应该了解到caffe是一个深度学习框架,在建立好神经网络模型之后,使用大量的数据进行迭代调参数获取到一个深度学习模型,我们使用这样的模型来实现我们的任务,如:图像分类,目标检测等。

在caffe中,训练好的模型为*.caffemodel,在github上面下载的caffe源代码中并没有caffemodel,需要我们单独去下载,下载地址同样也在caffe在git的官网上(经典Alex模型下载点这里),在git上面还有其它已经训练好的模型文件,如GooLenet,Rcnn模型等等。

在下载好model文件之后,按照下面的步骤进行模型的finetuning。

1. 下载数据,转换数据( Convert data)
2. 定义网络结构(Define net (as prototxt) )
3. 设置网络训练过程中的各种参数(Define solver (as prototxt) )
4. 开始训练(Train (with pretrained weights))

1.下载数据按照要求准备好数据,这里主要讲一下如何将数据转换写入db文件中,方便网络训练过程中对数据的读写要求。

使用tools/convert_imageset.cpp将获取到的数据和标签写入db文件中。

需要注意的是,对于每一个训练样本,文件的格式应该是:

“[path/to/image.jpeg] [label]”

2.设计定义网络结构
● 如果是训练过程,那么需要重新写一个*.prototxt 文件,文件格式可以参考src/caffe/proto/caffe.proto下的定义。最简单的方法就是复制一个example中的proto文件根据自己的需要进行修改
● 如果需要对网络进行finetuning,那么复制一份该model文件对应的prototxt文件进行修改,因为finetuning的过程是让原有训练好的模型适应自己的数据,因此一般情况下,网络的模型并没有大的变化。需要做的事情有:
  ○ 修改文件中的数据层(因为是进行finetuning,因此数据输入层是自己的数据)
  ○ 修改输出层,因为一般情况下,finetuning的应用与原模型的应用不完全相同。

  如:imagenet中的分类输出为1000类,所以在最终输出层时会是一个1000的向量,但是在实际应用中,类别可能只有10+种,因此不能直接使用imagenet中的输出层,需要对输出层进行修改;
  ○ 如果GPU比较小,计算能力比较差的话,需要减小batch_size参数,提高迭代效率;
  ○ **将blobs_lr参数设置为0**, 因为在finetuning过程中,网络的答题框架参数是不变的,我们只需要使用自己的数据对网络的小部分结构中参数进行更新和学习,因此需要将blob_lr参数设置为0,将网络的层参数进行冻结,不进行更新。

3.定义网络参数(proto文件)

  在对caffe熟悉过程中,了解到在使用caffe进行网络训练时,需要在*.proto文件中设定网络训练所需参数信息。需要修改的地方有:

○ 将网络改成自己的网络
○ 修改snapshot的前缀snapshot_prefix(用于存储训练过程中的中间结果)
○ 减小基础学习率(base learning rate,divide by 100)
○ 修改参数max_iter 和 snapshot

Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning的更多相关文章

  1. 【神经网络与深度学习】Caffe使用step by step:使用自己数据对已经训练好的模型进行finetuning

    在经过前面Caffe框架的搭建以及caffe基本框架的了解之后,接下来就要回到正题:使用caffe来进行模型的训练. 但如果对caffe并不是特别熟悉的话,从头开始训练一个模型会花费很多时间和精力,需 ...

  2. caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片

    经过前面两篇博文的学习,我们已经训练好了一个caffemodel模型,并生成了一个deploy.prototxt文件,现在我们就利用这两个文件来对一个新的图片进行分类预测. 我们从mnist数据集的t ...

  3. Caffe使用step by step:caffe框架下的基本操作和分析

    caffe虽然已经安装了快一个月了,但是caffe使用进展比较缓慢,果然如刘老师说的那样,搭建起来caffe框架环境比较简单,但是完整的从数据准备->模型训练->调参数->合理结果需 ...

  4. 【神经网络与深度学习】Caffe使用step by step:caffe框架下的基本操作和分析

    caffe虽然已经安装了快一个月了,但是caffe使用进展比较缓慢,果然如刘老师说的那样,搭建起来caffe框架环境比较简单,但是完整的从数据准备->模型训练->调参数->合理结果需 ...

  5. Step By Step(Lua数据持久化)

    Step By Step(Lua数据持久化) 1. 数据文件:    我们可以利用Lua中table的构造式来定义一种文件格式,即文件中的数据是table构造并初始化的代码,这种方式对于Lua程序而言 ...

  6. SQL Server 维护计划实现数据库备份(Step by Step)(转)

    SQL Server 维护计划实现数据库备份(Step by Step) 一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server  ...

  7. EF框架step by step(7)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  8. EF框架step by step(7)—Code First DataAnnotations(1)

    Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式.Code First允许你使用代码来建立实体框架模型,同时允许用Data a ...

  9. 转载自~浮云比翼:Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

随机推荐

  1. Kubernetes学习之路(十三)之Pod控制器--DaemonSet

    一.什么是DaemonSet? DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本.当有 Node 加入集群时,也会为他们新增一个 Pod .当有 Node 从集群移除时,这 ...

  2. python易错盲点排查之+=与+的区别分析以及一些赋值运算踩过的坑

    问题1. int和list是不一样的 >>> a=1 >>> b=a >>> a+=1 >>> a,b (2, 1) >& ...

  3. 私有Docker仓库login Error response from daemon: Get https://x.x.x.x/v2/: dial tcp x.x.x.x:443: connect: connection refused

    一.登陆私有仓库错误: docker login --username=evan 192.168.0.203 Error response from daemon: Get https://192.1 ...

  4. ubuntu lvm模式进行扩容

    ubuntu的16.04 18.04有lvm的功能(安装的时候的选项),能在磁盘空间用完的时候,无缝增加一个磁盘进去.因为linux系统只有一个盘,所以是非常方便,不会有windows加1个磁盘要进行 ...

  5. LeetCode 刷题笔记 2. 有效的括号(Valid Parentheses)

    tag: 栈(stack) 题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须 ...

  6. thrift0.5入门操作

    在探索未知的程序之前,我们往往会使用“Hello World”这个经典的输出作为测试,为了遵循这个惯例,作为thrift菜鸟都不算的一员,决定跑一下“Hello world”正式进入菜鸟的行列. th ...

  7. Plasma Cash 合约解读

    作者介绍 虫洞社区·签约作者 steven bai Plasma Cash 合约解读 Plasma Cash 合约解读 1. 合约代码 2. 合约文件简单介绍 3. Plasma Cash 的基础数据 ...

  8. sar命令详解

    基础命令学习目录首页 原文链接:http://lovesoo.org/linux-sar-command-detailed.html sar(System Activity Reporter系统活动情 ...

  9. C++ 类 析构函数

    一.析构函数的定义 析构函数为成员函数的一种,名字与类名相同,在前面加‘~’没有参数和返回值在C++中“~”是位取反运算符.一个类最多只能有一个析构函数.析构函数不返回任何值,没有函数类型,也没有函数 ...

  10. 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http: ...