在经过前面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. CentOS 7 安装 caffe

    1.安装CUDA,很简单,傻瓜式安装 2.http://caffe.berkeleyvision.org/install_yum.html 按照里面安装 3.遇到的问题: LD -o .build_r ...

  2. P3592 [POI2015]MYJ

    P3592 [POI2015]MYJ 一道比较烦的区间dp.. 昨天上课讲到了这题,然后就在lg翻到了 然后调了很久很久..... 设\(f[l][r][k]\)为区间\([l,r]\)中,最小值\( ...

  3. JAVA基础 XML生成与解析和String包装类下 .replace方法的使用以及char和字符序列的使用场景

    ptLink0.setText(arbu.getPtLink().replace("&","&")); // 如果像 '&','& ...

  4. Distributed1:链接服务器

    链接服务器(Linked Server)允许访问针对OLE DB数据源的分布式异构查询, 通过使用sys.sp_addlinkedserver创建链接服务器后,可以对此服务器运行分布式查询. 如果链接 ...

  5. linux增加硬盘 磁盘分区格式化及挂载

    nux磁盘分区格式化及挂载 意义: 给linux 系统服务器扩容, 加一块硬盘 实验环境: virtualBox虚拟软件  + centos6.5 第一步: 添加硬件 硬盘 (我这里用virtualB ...

  6. vue处理循环列表动态数据问题

    调用方法:Vue.set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值 <!DOCTYPE ...

  7. 1.0 JAVA基础核心概念

    JAVA基础知识 转载至:http://www.runoob.com/java/java-variable-types.html 对菜鸟教程进行核心整理: 一.JAVA理论概念 1.基础概念 Java ...

  8. 《图解 HTTP 》阅读 —— 第一章

    第1章 了解web及网络基础 计算机与网络设备相互通信的规则称为协议,比如:如何探测到通信目标.由哪一边发起通信.使用那种语言进行通信.怎么结束通信等. TCP/IP 协议族按照层次分为以下四层:应用 ...

  9. 【Ansible】ansible 任务失败控制

    任务失败控制 Ansible 通常默认会确保检测模块和命令的返回码并且会快速失败 – 专注于一个错误除非你另作打算. 有时一条命令会返回 0 但那不是报错.有时命令不会总是报告它 ‘改变’ 了远程系统 ...

  10. 简单理解DNS解析流程(一)

    0x0 简单理解dns DNS服务器里存着一张表 表中放着域名和IP地址,域名和IP地址以映射关系保存,即一对一 浏览器访问某个域名,实际上是访问它的ip地址 所以浏览器需要知道域名对应的ip地址 如 ...