caffe怎么通过显卡计算caffe batchsizee

拒绝访问 |
| 百度云加速
请打开cookies.
此网站 () 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(a343d1-ua98).
重新安装浏览器,或使用别的浏览器4328人阅读
Deep-learning(7)
本次实验本来参考examples/imagenet下的readme.txt进行,但因为数据集过于庞大,所以模拟学习,参考薛开宇的学习方式,模仿搭建自己的数据库。
首先在caffe/data下新建文件夹myself,然后在网上下载猫、鸟、狗的训练图片各50张,测试图片17,11,14张。为了方便,把图片名修改,使用python,代码如下:
def rename():
name="dog";
path='/home/jack/caffe/data/myself/train/dog';
filelist=os.listdir(path)
for files in filelist:
olddir=os.path.join(path,files);
if os.path.isdir(olddir):
filename=os.path.splitext(files)[0];
filetype=os.path.splitext(files)[1];
newdir=os.path.join(path,name+str(count)+filetype);
os.rename(olddir, newdir);
重复使用下面这几句话,最后将三类训练数据的文件名都复制到一起。至于文件格式为何要这样.是参考data/ilsvrc12下的train.txt和val.txt.
find train/dog -name *.JPEG |cut -d '/' -f2-3 &train.txt
sed "s/$/ 2/" ./train.txt&./train1.txt
当然我这方法比较蠢,也可以写脚本文件,或者使用python处理也是可以的。
此外还需要添加test.txt,内容和val.txt一致,不过最后面不跟分类标签,而是0.
我们还需要把图片的大小变成 256X256,但在一个集群环境,可以不明确的进行,使用Mapreduce 就可以了,像杨青就是这样做的。如果我们希望更简单,用下面的命令:
for name in train/bird/*.JPEG ; do
convert -resize 256x256\! $name $name; done
for name in train/dog/*.JPEG ; do
convert -resize 256x256\! $name $name; done
for name in train/cat/*.JPEG ; do
convert -resize 256x256\! $name $name; done
for name in val/*.JPEG ; do
convert -resize 256x256\! $name $name; done
接下来在caffe/examples中新建myself文件夹,然后将caffe/examples/imagenet的create_imagenet.sh复制到该文件夹下,将其名改为create_myimagenet.sh,修改训练和测试路径的设置,运行该sh.如图:
如果出现错误./create_myimagenet.sh: 39: ./create_myimagenet.sh: build/tools/convert_imageset: not found
Creating val lmdb...
./create_myimagenet.sh: 49: ./create_myimagenet.sh: build/tools/convert_imageset: not found
说明路径有问题,最好像我这样补全。完成后在examples/myself下多出连个文件夹,如下图
2 计算图像均值
减去图像均值会获得更好的效果,所以我们使用tools/compute_image_mean.cpp实现,这个cpp是一个很好的例子去熟悉如何操作多个组建,例如协议的缓冲区,leveldbs,登录等。我们同样复制caffe-maester/examples/imagenet的
./make_imagenet_mean到examples/myself中,将其改名为make_myimagenet_mean.sh,加以修改路径。
不管如何修改文件名和路径一定要对应,不然会有小问题出现。运行./make_myimagenet_mean.sh会在data/myself下出现myimagenet_mean.binaryproto文件
3 网络的定义
把caffe/models/bvlc_reference_caffenet中所有文件复制到caffe/examples/myself文件夹中,修改train_val.prototxt,注意修改数据层的路径。如图:
name: "CaffeNet"
name: "data"
type: "Data"
top: "data"
top: "label"
phase: TRAIN
transform_param {
mirror: true
crop_size: 227
mean_file: "data/myself/myimagenet_mean.binaryproto"
# mean pixel / channel-wise mean instead of mean image
transform_param {
crop_size: 227
mean_value: 104
mean_value: 117
mean_value: 123
mirror: true
data_param {
source: "examples/myself/ilsvrc12_train_lmdb"
batch_size: 256
backend: LMDB
name: "data"
type: "Data"
top: "data"
top: "label"
phase: TEST
transform_param {
mirror: false
crop_size: 227
mean_file: "data/myself/myimagenet_mean.binaryproto"
# mean pixel / channel-wise mean instead of mean image
transform_param {
crop_size: 227
mean_value: 104
mean_value: 117
mean_value: 123
mirror: false
data_param {
source: "examples/myself/ilsvrc12_val_lmdb"
batch_size: 50
backend: LMDB
从里面可以观察到,我们将运行256批次,迭代4500000次(90期),每1000次迭代,我们测试学习网络验证数据,我们设置初始的学习率为0.01,每期)次迭代减少学习率,显示一次信息,训练的weight_decay为0.0005,每10000次迭代,我们显示一下当前状态。
以上是教程的,实际上,以上需要耗费很长时间,因此,我们稍微改一下
test_iter: 1000是指测试的批次,我们就10张照片,设置10就可以了。
test_interval: 1000是指每1000次迭代测试一次,我们改成500次测试一次。
base_lr: 0.01是基础学习率,因为数据量小,0.01就会下降太快了,因此改成0.001
lr_policy: “step”学习率变化
gamma: 0.1学习率变化的比率
stepsize: 0000次迭代减少学习率
display: 20每20层显示一次
max_iter: 450000最大迭代次数,
momentum: 0.9学习的参数,不用变
weight_decay: 0.0005学习的参数,不用变
snapshot: 10000每迭代10000次显示状态,这里改为2000次
solver_mode: GPU末尾加一行,代表用GPU进行
如果出现错误cudasucess(2.0vs 0)out of memory之类的说明batchsize太大,我设置成4和5。然后如果训练不收敛就重试,我试了三次,每次用的时间都超过15个小时,2.1计算能力的电脑就是差,今天总算完成了。
准确率并不高,可能是选的图片不是很好,这个也有关系的,另外我是有三类和他们的两类不一样。训练完成后结果存放在哪里我也不是很清楚,只知道myself前一级文件夹下有很多类似
myself_iter_160.caffemodel的文件出现。现在还不是很懂,此外还有查看GPU状态的指令nvidia-smi。实践还是得跟进理论,不然很多东西都云里雾里的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:36965次
排名:千里之外
原创:24篇
(2)(2)(6)(1)(3)(1)(4)(1)(5)22608人阅读
机器学习(11)
caffe在[1]讲到如何看一个图片的特征和分类结果,但是如何批量抽取特征呢?可以使用c++的版本,这里我们谈下如何用python批量抽取特征。
首先,我们要注意caffe&filter_visualization.ipynb的程序中deploy.prototxt中网络每一轮的图片batch是10, 这个数刚好和oversample=true的crop数量是一样的,也就是net一轮forward 刚好是一张图片的10个crop。
第一种,oversample = true的情况, 也就是每张图片会产生10张crop的图片: center, 4 corner, 和mirror
假如我们要抽取两张图片, 每张图片有10个crop
首先是修改deploy.prototxt: input_dim : 20
然后:将imagelist 放入predict参数。
scores = net.predict([caffe.io.load_image(caffe_root + &building.jpg&), caffe.io.load_image(caffe_root + &thumb.jpg&)])
net.blobs['fc7'].data[4]
net.blobs['fc7'].data[14]
import numpy as np
import scipy
caffe_root = '/home/hduser/Project/caffe/'
import sys
sys.path.insert(0,caffe_root + 'python/')
import caffe
net = caffe.Classifier(caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt',
caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel',image_dims=(256, 256))
net.set_phase_test()
net.set_mode_cpu()
net.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy'))
net.set_raw_scale('data', 255)
net.set_channel_swap('data', (2,1, 0))
#in fact, you can input a list of images.
scores = net.predict([caffe.io.load_image(caffe_root + &building.jpg&), caffe.io.load_image(caffe_root + &thumb.jpg&)])
output = open(&feature.txt&, &w&)
#the fc6 is the fc6 layer feature, data[4] means the five crop images, because each image will be crop to 10 sub-images.
feat = net.blobs['fc6'].data[4]
feat2 = net.blobs['fc6'].data[14]
这样不好的地方是需要修改deploy.prototxt, 另一种方法[2]:modify predict() in python/caffe/classifier.py to store them before the blobs in net are overwritten by the features of a subsequent batch. 该种方法我还没尝试,改天试下。
&span style=&font-family: Arial, Helvetica, sans- background-color: rgb(255, 255, 255);&&第二种情况, 如果图片不需要crop成10张子图片的话,可以用oversample=False,如果设置image_dims=(256, 256), 由于bvlc_reference_caffenet trained model 是227*227的图片大小,所以python/caffe/classifier.py的代码会take center crop 227*227 from 256*256.&/span&
input_dim : 2&
&span style=&font-family: Arial, Helvetica, sans- background-color: rgb(255, 255, 255);&&第一张图片:net.blobs['fc7'].data[0],&/span&&span style=&font-family: Arial, Helvetica, sans- background-color: rgb(255, 255, 255);&&第二张图片:net.blobs['fc7'].data[1]&/span&
后记:还需要熟悉下caffe的python接口函数,可惜貌似看不到这方面的api,只有自己先琢磨琢磨。
参考文章:
1.&http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb&
2.&/forum/#!searchin/caffe-users/python$20batch$20feature$20extraction/caffe-users/wIgLYMF54AI/iuDf3fZ0_K0J
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:191702次
积分:2298
积分:2298
排名:第16359名
原创:79篇
评论:140条
weibo:/pkubrooks/home github: /guoyilin
(9)(15)(4)(1)(3)(2)(2)(6)(3)(19)(1)(6)(3)(1)(2)(1)(1)(2)(3)(1)利用GPU和Caffe训练神经网络
发表于 07:53|
来源www.joyofdata.de|
作者Raffael Vogler
摘要:本文为利用GPU和Caffe训练神经网络的实战教程,介绍了根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练一种多层前馈网络模型的方法,如何将模型应用于新数据,以及如何将网络图和训练权值可视化。
【编者按】本文为利用GPU和Caffe训练神经网络的实战教程,介绍了根据Kaggle的“奥托集团产品分类挑战赛”的数据进行训练一种多层前馈网络模型的方法,如何将模型应用于新数据,以及如何将网络图和训练权值可视化。Caffe是由发起的一个开源深度学习框架,它允许你利用你的GPU训练神经网络。相对于其他的深度学习框架如Theano或Torch等,Caffe不需要你自己编写算法程序,你只需要通过配置文件来指定网络。显然,这种做法比自己编写所有程序更加节省时间,也将你限制在一定的框架范围内。不过,在大多数情况下,这没有太大的问题,因为Caffe提供的框架相当强大,并且不断进步。这篇文章的主题由一种多层前馈网络组成。该模型将根据Kaggle的“”的数据进行训练。我们还关注将模型应用于新数据,以及如何将网络图(network graph)和训练得到的权值可视化。限于篇幅,本文不会解释所有的细节。另外,简单的代码比一千多字的话更有说服力。相对于对照来程序化细节,本文将着重描述观念以及一些我遇到的绊脚石。设置如果你还没有把Caffe安装在你的系统上,我建议在一个允许GPU处理的EC2实例上工作,例如g2.2xlarge实例。有关如何使用EC2工作的介绍可以查看,设置Caffe及其准备工作可以参考。对于使用Caffe,我也建议你在你的实例上安装IPython
Notebook——在可以找到教程。定义模型和元参数一个模型及其应用的训练至少需要三个配置文件。这些配置文件的格式遵循界面描述语言,称为协议缓冲区()。它表面上类似于JSON,但却又显著不同,实际上应该在需要进行验证(通过自定义模式的方式——像Caffe的这样)和序列化的数据文档中取代它。为了训练,你必须有一个prototxt文件保持训练的元参数()以及一个模型用于定义网络图形()——以非周期和定向的方式连接各层。需要注意的是,数据从底部流向到顶部时伴随着关于怎样指定层的顺序。这里的示例网络有五个层次:数据层(一个用于训练,一个用于测试)内积层(权值Ⅰ)ReLUs(隐含层)内积层(权值Ⅱ)输出层(用于分类的Soft Max)&A,Soft Max层给出损失&B,准确性层——允许我们看到网络如何在训练的同时提升。以下从model_train_test.prototxt的摘录显示层(4)和(5A):[...]
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
inner_product_param {
num_output: 9
weight_filler {
type: "xavier"
bias_filler {
type: "constant"
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
phase: TEST
[...]第三个prototxt文件()指定应用于它的网络。在这种情况下,它与训练规范大体上是一致的——但它缺乏数据层(因为我们不从产品的数据源中读取数据)并且Soft Max层不会产生损耗值但有分类的可能。另外,准确性层现在已经没有了。还要注意的是,我们现在在开始指定输入尺寸(如预期:1,93,1,1)——它是肯定混乱的,所有四个尺寸被称为input_dim,只有顺序定义哪个是哪个,并没有指定明确的背景。支持的数据源这是开始尝试使用Caffe时要克服的首要心理障碍之一。它不像使用一些CSV来提供Caffe可执行的方式那样简单。实际上,对于没有图像的数据,你有三种选择。LMDB(闪电内存映射数据库)LevelDBHDF5格式HDF5可能是最容易使用的,因为你只需要采用HDF5格式把数据集存储到文件中。LMDB和LevelDB是数据库,所以你必须按照他们的协议。HDF5格式存储数据集的大小会被内存限制,这就是为什么我抛弃它的原因。LMDB和LevelDB之间的选择是相当随便的——从我掠过的资源来看,LMDB似乎更强大,速度更快,更成熟。然后从GitHub来看,LevelDB的维护似乎更积极,也具有较大的Google和StackOverflow的足迹。Blobs和DatumsCaffe内部使用一个叫做Blobs的数据结构进行工作,它用于正向传递数据和反向渐变。这是一个四维数组,其四个维度被称为:N或batch_size通道高度宽度这与我们有关,因为在把它存储到LMDB之前我们必须按照结构塑造我们的案例——从它被送到Caffe的地方。图像的形状是直观的,一批次64个按规定的100×200 RGB像素的图像将最终作为形阵列(64,3,200,100)。对于一批64个特征矢量,每个长度93的Blob的形状为(64,93,1,1)。在将数据加载到LMDB时,你可以看到个别案例或特征向量存储在Datum的对象上。整型数据被存储在(字节串格式)data中,浮点型数据存储在float_data中。一开始我犯错将浮点型数据分配到data中,从而导致该模型不学习任何东西。在将Datum存储到LMDB之前,你需要将对象序列化成一个字节的字符串表示。总结对我来说,掌握Caffe是一个令人惊讶的非线性体验。也就是说,要深刻理解这个系统,还没有任何的切入点和持续的学习路径。让Caffe对你发挥作用的有效信息,分布在很多不同的,,以及。这就是为什么我花时间撰写本教程及相关的代码。在我将学到的知识总结形成文本之后,我自己都要从头读一下。我认为Caffe有一个光明的未来——只要添加新的功能,它将不仅仅是水平的增长,而且会垂直的重构和改善所有用户的体验。这绝对是高性能深度学习的好工具。如果你想要做图像处理和卷积神经网络,我建议你看看,它会为你提供一个舒适的GUI来实现目标。原文链接:(翻译/王玮 责编/周建丁)
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章1086人阅读
caffe(21)
今天看到群里有人问”用matlab输出测试集的精度“,瞎试了一下,好像还成功了。主要还是依据前面所有在matlab中操作caffe的博客。
这里说一下:classification.m是适用单张图片的精度,类似于classification.exe的功能;这里要做的是在matlab中实现caffe.exe test的功能,也就是批量输出精度
根据caffe.exe test和classification.m的流程,很容易想到,直接把训练时候所用的prototxt丢进去,对比classification.m中调用caffe.Net(model,wights,'test')的思路,试试当model为train_test.prototxt而非deploy.prototxt的效果。然后按照前面caffe在matlab中训练的方法,进行一次前向计算,当然此前向计算需要数据已经载入网络中,而非像classification一样挨个输入。z最后按照前面可视化权重的博客,提取最后一层的accuracy就行了。
将数据集,也就是一堆图片,利用convert的那个exe转换为lmdb格式
在prototxt中更改测试部分的输入为你所转换的lmdb路径
细节调整,比如你有没有均值文件,加入到prototxt中
加载模型,命令caffe.Net
前向计算forward_prefilled命令
利用blob取最后一层accuracy的值
数据集转换
以mnist为例,测试集的lmdb文件在前面已经制作出来了,如果是你自己的图片,可以看前面转换数据集的博客。
修改模型输入
随后修改lenet_train_test1.prototxt的测试集部分内容为你自己的转换数据集
其中有一个参数batch_size先记在心里。
if exist('../../+caffe', 'dir')
addpath('../..');
error('Please run this demo from caffe/matlab/demo');
caffe.reset_all
if exist('use_gpu', 'var') && use_gpu
caffe.set_mode_gpu();
gpu_id = 0;
caffe.set_device(gpu_id);
caffe.set_mode_cpu();
model_dir = './test/';
net_model = [model_dir 'lenet_train_test1.prototxt'];
net_weights = [model_dir 'lenet_iter_10000.caffemodel'];
if ~exist(net_weights, 'file')
error('Please download CaffeNet from Model Zoo before you run this demo');
net = caffe.Net(net_model, net_weights, 'test');
for i=1:49
net.forward_prefilled
acc=[ net.blobs('accuracy').get_data()];
看看使用caffe.exe test的命令和我们的输出acc的结果对应与否
应该是对应的吧,手动滑稽。
【注】记得刚才说的batchsize吧,看代码倒数第三行,有一个for循环,这里写的49,意思就是图片总数除以batchsize,得到的结果就是这个for循环的上限。
源代码各种文件打包放送
链接: 密码:rom5
直接运行里面的caffe_test.m即可,注意自己caffe的matlab接口一定要配置好。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:361730次
积分:4359
积分:4359
排名:第6906名
原创:86篇
转载:23篇
评论:906条
运动捕捉研究者, 主要倾向于3D骨骼数据处理(识别, 风格化, 运动控制等)的研究,准备转型探索pose estimation相关知识, 大体技术还是使用深度学习, 技术以RBM为主,CNN和RNN为辅,欢迎相关人士私信讨论.
闲暇之余会在个人中fork和分享一些与Motion Capture和 Deep Learning相关新技术 ~欢迎大家访问交流.
邮件:zb at gmail dot com(防垃圾邮件,可自行转成正常邮箱)
(3)(2)(9)(8)(1)(5)(8)(5)(5)(9)(9)(3)(9)(1)(1)(3)(2)(15)(20)

我要回帖

更多关于 caffe中batch size 的文章

 

随机推荐