CaffeNet用于Flickr Style数据集上的风格识别
转自 http://blog.csdn.net/liumaolincycle/article/details/48501423
微调是基于已经学习好的模型的,通过修改结构,从已学习好的模型权重中继续训练。下面就在另一个数据集Flickr Style上面微调CaffeNet模型,来预测图像风格,而不再是目标类别。
1.说明
Flickr Style图像数据集在视觉上和训练了bvlc_reference_caffenet的ImageNet数据集很像,由于这个模型在目标分类上用得很好,我们就想把它也用在风格分类器中。因为只有80,000个图像可用于训练,所以从用了1,000,000个图像的ImageNet学到的参数开始训练,再根据需要进行微调。如果给出caffe train命令的weights参数,预训练的权重就会载入模型中,通过名字来匹配层。
因为我们现在只预测20个类而不再是1,000个,所以需要修改模型中的最后一层,把prototxt最后一层的名字由fc8改为fc8_flickr。bvlc_reference_caffenet中没有层名叫fc8_flickr,因此该层将从随机权重开始训练。同理,可以多改几个其它层的名字,被修改的层都会从随机权重开始训练。
此外,减少solver prototxt中的总体学习率base_lr,但是增加新引进层的blobs_lr。主要原因是新数据让新加的层学习很快,模型中剩下的层改变很慢,在solver中设置stepsize为更低的值,希望学习率下降快一些。我们也可以通过设置blobs_lr为0来阻止除fc8_flickr外的所有层微调。
2.步骤
数据集已经分解为带相应标签的URL列表,用一个简单python脚本assemble_data.py下载数据的子集并将其分为训练集和验证集,先看一下用法:
./examples/finetune_flickr_style/assemble_data.py -h
再用它下载数据集:
python examples/finetune_flickr_style/assemble_data.py --workers=-1 --images=2000 --seed 831486
这个脚本下载2000个图像和相应的train/val文件到data/flickr_style中,这里感谢 鱼蛋蛋哥 和 小咸鱼_ 指出,在用自己的数据训练时,编号一定要从0开始,或者最后一层的输出类别数要大于最大的编号,否则不会收敛。
本例的prototxt还需要ImageNet的均值文件,运行:
./data/ilsvrc12/get_ilsvrc_aux.sh
下载在data/ilsvrc12中。
我们还需要ImageNet训练而得的模型,运行:
./scripts/download_model_binary.py models/bvlc_reference_caffenet
- 1
下载在models/bvlc_reference_caffenet中,就可以开始训练了:
./build/tools/caffe train \
-solver models/finetune_flickr_style/solver.prototxt \
-weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \
-gpu 0
可以看一下 models/finetune_flickr_style/solver.prototxt和models/finetune_flickr_style/train_val.prototxt中的内容。
注意看损失下降的速度,尽管迭代1000次后达到的23.5%准确率不是很好,但在这么少的迭代次数就达到了,说明模型正在又快又好地学习。当模型在整个训练集上做了100,000次迭代,完全微调好,准确率是39.16%。我只迭代了10,000次,也达到了29.46%,在GTX660上用了一个半小时。
不用微调预训练模型而是直接训练时:
./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -gpu 0
微调适用于时间不够或数据不够的情况,即使在CPU模式,每遍历一次训练集也只要大约100s,GPU微调显然更快,并能在数分钟或数小时内学习到有用模型,而不再需要数天或数周了。
3.训练的模型
训练完全部80K图像得到的模型最终准确率为39%,可由下面的命令得到该训练好的模型:
./scripts/download_model_binary.py models/finetune_flickr_style
CaffeNet用于Flickr Style数据集上的风格识别的更多相关文章
- Fine-tuning CaffeNet for Style Recognition on “Flickr Style” Data 数据下载遇到的问题
(下载的时候没有提示 不知道是正在下 还是出现错误 卡着了)..一直没有反应 下载前要以管理员身份运行 sudo su 再 python examples/finetune_flickr_style/ ...
- [中英对照]Linux kernel coding style | Linux内核编码风格
Linux kernel coding style | Linux内核编码风格 This is a short document describing the preferred coding sty ...
- (2) 用DPM(Deformable Part Model,voc-release4.01)算法在INRIA数据集上训练自己的人体检測模型
步骤一,首先要使voc-release4.01目标检測部分的代码在windows系统下跑起来: 參考在window下执行DPM(deformable part models) -(检測demo部分) ...
- TersorflowTutorial_MNIST数据集上简单CNN实现
MNIST数据集上简单CNN实现 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 源代码请点击下方链接欢迎加星 Tesorflow实现基于MNI ...
- Microsoft Dynamics CRM 2011 当您在 大型数据集上执行 RetrieveMultiple 查询很慢的解决方法
症状 当您在 Microsoft Dynamics CRM 2011 年大型数据集上执行 RetrieveMultiple 查询时,您会比较慢. 原因 发生此问题是因为大型数据集缓存 Retrieve ...
- 在Titanic数据集上应用AdaBoost元算法
一.AdaBoost 元算法的基本原理 AdaBoost是adaptive boosting的缩写,就是自适应boosting.元算法是对于其他算法进行组合的一种方式. 而boosting是在从原始数 ...
- BP算法在minist数据集上的简单实现
BP算法在minist上的简单实现 数据:http://yann.lecun.com/exdb/mnist/ 参考:blog,blog2,blog3,tensorflow 推导:http://www. ...
- NASNet学习笔记—— 核心一:延续NAS论文的核心机制使得能够自动产生网络结构; 核心二:采用resnet和Inception重复使用block结构思想; 核心三:利用迁移学习将生成的网络迁移到大数据集上提出一个new search space。
from:https://blog.csdn.net/xjz18298268521/article/details/79079008 NASNet总结 论文:<Learning Transfer ...
- MNIST数据集上卷积神经网络的简单实现(使用PyTorch)
设计的CNN模型包括一个输入层,输入的是MNIST数据集中28*28*1的灰度图 两个卷积层, 第一层卷积层使用6个3*3的kernel进行filter,步长为1,填充1.这样得到的尺寸是(28+1* ...
随机推荐
- SqlServer数据库基本用法
. 利用T-SQL语句,创建数据库(工资管理数据库),要求如下: 数据库初始大小:3MB:文件大小按兆字节3MB自动增长,增长限制为:15MB: 数据库日志文件初始大小:1MB: 文件大小按百分比5% ...
- WP 图片加载时显示加载中
private BitmapImage srcimage = new BitmapImage(); public MainPage() { InitializeComponent(); progres ...
- hiho1804 - 整数分解、组合数、乘法逆元
题目链接 题目叙述很啰嗦,可以简化为:n个球[1-1e5],放到m个不同的桶里,一共多少种不同的放法.[桶里可以不放] ---------------------------------------- ...
- 将数据库返回的ResultSett转换成List装Map形式的方法(ResultSetToList)
多时候想做一些关于数据库实验,如果先搭建框架太麻烦,直接得到ResultSet处理起来取值什么的也很繁琐,为此我做了一个将ResultSet转换成List<Map<String,Objec ...
- 模拟一个简单的基于tcp的远程关机程序(转)
最近在学习unix网络编程,现在正在学习tcp的通信.其实,只要建立起了tcp通信,操作远端的计算机就不是什么问题了.正向telnet一样,也是基于tcp/IP协议的.所以这个实验,也算是对telne ...
- anuglar.js ui-router传递参数
anuglar.js ui-router 传递参数的方法有: 一: ui-sref 传递参数,传递一个参数的时候 首先路有这样写: .state('edit', { //线路编辑页面 url: '/e ...
- Express 初步使用
Express express 是 node 中最流行的框架之一. 1. 起步 安装: npm install express --save hello world const express = r ...
- Project Euler 26 Reciprocal cycles( 分数循环节 )
题意: 单位分数指分子为1的分数.分母为2至10的单位分数的十进制表示如下所示: 1/2 = 0.5 1/3 = 0.(3) 1/4 = 0.25 1/5 = 0.2 1/6 = 0.1(6 ...
- [SDOI2016]数字配对(费用流+贪心+trick)
重点是如何找到可以配对的\(a[i]\)和\(a[j]\). 把\(a[i]\)分解质因数.设\(a[i]\)分解出的质因数的数量为\(cnt[i]\). 设\(a[i]\geq a[j]\) 那么\ ...
- 学习redis遇到的问题
1. pipeline为什么批量执行速度会变快? 答:是因为在tcp连接中减少了交互往返的时间,因为每次执行还要返回响应值,并且是一条执行完成之后才会执行下一条,但是批量执行只需要一次往返,所以节省了 ...