(转)如何使用caffe的MATLAB接口
编译MatCaffe
转自: http://blog.csdn.net/ws_20100/article/details/50525879
使用如下命令编译MatCaffe
make all matcaffe
- 1
之后,你可以用以下命令测试MatCaffe:
make mattest
- 1
如果你在运行上面命令时,遇到如下错误:libstdc++.so.6 version ‘GLIBCXX_3.4.15’ not found,说明你的Matlab库不匹配。你需要在启动Matlab之前运行如下命令:
export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
- 1
- 2
在Caffe根目录启动Matlab之后需要增加路径:
addpath ./matlab
- 1
你可以使用savepath来保存Matlab搜索路径,这样下次就不用再添加路径了。
使用MatCaffe
MatCaffe 和 PyCaffe 的使用方法很相似。
下面将用一个例子来解释MatCaffe的具体使用细节,假设你已经下载了BVLC CaffeNet,并且在caffe根目录启动matlab。
model = './models/bvlc_reference_caffenet/deploy.prototxt';
weights = './models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel';
- 1
- 2
- 3
1.设置模式和设备
模式和设备的设置必须在创建一个net或solver之前。
使用CPU:
caffe.set_mode_cpu();
- 1
使用GPU并指定gpu_id:
caffe.set_mode_gpu();
caffe.set_device(gpu_id);
- 1
- 2
2.创建一个网络并访问它的layers和blobs
1.创建网络
创建一个网络:
net = caffe.Net(model, weights, 'test'); % create net and load weights
- 1
或者
net = caffe.Net(model, 'test'); % create net but not load weights
net.copy_from(weights); % load weights
- 1
- 2
它可以创建一个如下的net对象:
Net with properties:
layer_vec: [1x23 caffe.Layer]
blob_vec: [1x15 caffe.Blob]
inputs: {'data'}
outputs: {'prob'}
name2layer_index: [23x1 containers.Map]
name2blob_index: [15x1 containers.Map]
layer_names: {23x1 cell}
blob_names: {15x1 cell}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
两个containers.Map对象可以通过layer或者blob的名称找到对应的索引。
2.访问blob
你可以访问网络中的每一个blob,将data的blob填充为全一:
net.blobs('data').set_data(ones(net.blobs('data').shape));
- 1
将data的blob中数值全部乘以10:
net.blobs('data').set_data(net.blobs('data').get_data() * 10);
- 1
注意:因为Matlab是以1作为起始单元,且以列为主,在Matlab中使用四维blob为[width, height, channels, num],且width是最快的维度,而且要在BGR通道。而且Caffe使用单精度浮点型数据。如果你的数据不是浮点型的,set_data将会自动转换为single。
3.访问layer
你也可以访问网络的每一层,以便你作一些网络调整。例如把conv1参数乘以10:
net.params('conv1', 1).set_data(net.params('conv1', 1).get_data() * 10); % set weights
net.params('conv1', 2).set_data(net.params('conv1', 2).get_data() * 10); % set bias
- 1
- 2
你也可以如下代码:
net.layers('conv1').params(1).set_data(net.layers('conv1').params(1).get_data() * 10);
net.layers('conv1').params(2).set_data(net.layers('conv1').params(2).get_data() * 10);
- 1
- 2
4.保存网络
你仅仅需要如下代码保存网络:
net.save('my_net.caffemodel');
- 1
5.获得一层的类型(string)
layer_type = net.layers('conv1').type;
- 1
3.前向和后向计算
前向和后向计算可以使用net.forward或者net.forward_prefilled实现。函数net.forward将一个包含输入blob(s)的cell数组作为输入,并输出一个包含输出blob(s)的cell数组。函数net.forward_prefilled将使用输入blob(s)中的已有数据进行计算,没有输入数据,没有输出数据。
在通过一些方法(如:data = rand(net.blobs('data').shape);)产生输入数据后,你可以运行:
res = net.forward({data});
prob = res{1};
- 1
- 2
或者
net.blobs('data').set_data(data);
net.forward_prefilled();
prob = net.blobs('prob').get_data();
- 1
- 2
- 3
后向计算使用net.backward或者net.backward_prefilled,并且把get_data和set_data替换为get_diff和set_diff。在通过一些方法(例如prob_diff = rand(net.blobs('prob').shape);)产生输出blobs的梯度后,你可以运行:
res = net.backward({prob_diff});
data_diff = res{1};
- 1
- 2
或者
net.blobs('prob').set_diff(prob_diff);
net.backward_prefilled();
data_diff = net.blobs('data').get_diff();
- 1
- 2
- 3
然而,如上的后向计算并不能得到正确的结果,因为Caffe默认网络不需要后向计算。为了获取正确的后向计算结果,你需要在你的网络prototxt文件中设置force_backward: true
在完成前向和后向计算之后,你可以获得中间blobs的data和diff。例如,你可以在前向计算后获取pool5的特征。
4.Reshape
假设你想要运行1幅图像,而不是10幅时:
net.blobs('data').reshape([227 227 3 1]); % reshape blob 'data'
net.reshape();
- 1
- 2
然后,整个网络就reshape了,此时net.blobs('prob').shape应该是[1000 1];
5.训练网络
假设你按照ImageNET Tutorial的方法创建了训练lmdb和验证lmdb,产生一个solver并且在ILSVRC 2012 分类数据集上训练:
solver = caffe.Solver('./models/bvlc_reference_caffenet/solver.prototxt');
- 1
这样可以创建一个solver对象:
Solver with properties:
net: [1x1 caffe.Net]
test_nets: [1x1 caffe.Net]
- 1
- 2
- 3
- 4
训练代码:
solver.solve();
- 1
如果只想训练迭代1000次:
solver.step(1000);
- 1
来获取迭代数量:
iter = solver.iter();
- 1
来获取这个网络:
train_net = solver.net;
test_net = solver.test_nets(1);
- 1
- 2
假设从一个snapshot中恢复网络训练:
solver.restore('your_snapshot.solverstate');
- 1
6.输入和输出
caffe.io类提供了基本的输入函数load_image和read_mean。例如,读取ILSVRC 2012 mean文件(假设你已经通过运行./data/ilsvrc12/get_ilsvrc_aux.sh下载imagenet例程辅助文件)
mean_data = caffe.io.read_mean('./data/ilsvrc12/imagenet_mean.binaryproto');
- 1
为了读取Caffe例程图片,并且resize到[width, height],且假设width = 256; height = 256;
im_data = caffe.io.load_image('./examples/images/cat.jpg');
im_data = imresize(im_data, [width, height]); % resize using Matlab's imresize
- 1
- 2
注意:width是最快的维度,通道为BGR,与Matlab存取图片的一般方式不一样。如果你不想要使用caffe.io.load_image,且想自己导入一幅图片:
im_data = imread('./examples/images/cat.jpg'); % read image
im_data = im_data(:, :, [3, 2, 1]); % convert from RGB to BGR
im_data = permute(im_data, [2, 1, 3]); % permute width and height
im_data = single(im_data); % convert to single precision
- 1
- 2
- 3
- 4
你也可以看一下caffe/matlab/demo/classification_demo.m文件,了解如何将输入图片crop成多个输入块。
你可以查看caffe/matlab/hdf5creation,了解如何通过Matlab读和写HDF5数据。但不提供额外的数据输出函数,因为在Matlab本身已经具有了强大的功能。
7.清除nets和solvers
调用caffe.reset_all()来清理你所创建的所有的solvers,和stand-alone nets。
(转)如何使用caffe的MATLAB接口的更多相关文章
- ubuntu下 编译Caffe的Matlab接口
一般情况下不愿意使用Caffe的Matlab接口,总觉得Linux版的Matlab很难配置,但是现在搞目标检测,得到的源码是使用的Caffe的Matlab接口,只能硬着头皮上了. (1)修改caffe ...
- caffe的Matlab接口安装
参考博文:http://blog.csdn.net/thystar/article/details/50720691 0. Caffe安装及Matlab安装 1. Caffe中matcaffe配置 c ...
- Windows下调用caffe的matlab接口
一.编译caffe的matlab接口 在我的这篇博客windows-caffe配置已经说了怎么编译了,这里就略过了. 编译成功后,会得到如下图所示文件: matlab接口就在matcaffe文件夹里. ...
- 学习笔记之 初试Caffe,Matlab接口提取feature
Caffe 提供了matlab接口,可以用于提取图像的feature.
- ubuntu14.04&matlab2015b 测试caffe的Matlab接口
Step1: 修改caffe-master中的Makefile.config 提示:可以到文件中直接“ctrl+f”,键入相应大写字母即可查找到相应位置. Step2:编译接口.如果之前编译caffe ...
- Ubuntu caffe 测试matlab接口
这是17年8月份新增的: make matcaffe error 255解决:在Makefile里面,大约第410行那一句话CXXFLAGS += -MMD -MP下面添加CXXFLAGS += -s ...
- caffe的matlab接口一览表
blob 简述 方法: shape reshape get_diff set_diff 私有方法: check_and_preprocess_shape check_and_preprocess_da ...
- 【caffe-Windows】微软官方caffe之matlab接口配置,以及安装caffe的注意事项
1.在此之前,记录一下之前的错误,在参考博客[caffe-Windows]caffe+VS2013+Windows+GPU配置+cifar使用进行caffe的安装时,其中的一些步骤可以不做,具体见下图 ...
- win10编译caffe调用matlab接口
参考 https://www.cnblogs.com/njust-ycc/p/5776286.html https://www.cnblogs.com/heately/p/7922521.html
随机推荐
- php get_include_path();是干嘛的、??还有set_include_path();/?????
首先 我们来看这个全局变量:__FILE__ 它表示文件的完整路径(当然包括文件名在内) 也就是说它根据你文件所在的目录不同,有着不同的值:当然,当它用在包行文件中的时候,它的值是包含的路径: 然后: ...
- java快排(两种方法)
快排是最基础的排序算法之一,今天来回顾一下. public class QuickSort { public static void quickSort(int[] array){ if(array ...
- WordCount小程序及测试
Github项目地址:https://github.com/792450735/wc PSP表格: PSP2.1表格[1] PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Plann ...
- VS2012,更新补丁后--创建项目未找到与约束匹配的导出
更新过一次漏洞,后来尝试建立一个项目,结果错误终于暴露了,创建项目时无法成功创建,而且提示:未找到与约束ontractNameMicrosoft.VisualStudio.Text.ITextDocu ...
- malloc/free 与 new/delete同与不同
一.相同点 1.都是从堆上申请内存,由程序员来掌控这段内存的申请与释放. 2.对于内置类型,两者使用没有太大区别. 二.不同点 1.malloc/free是C++/C语言的标准库函数,需要库支持:ne ...
- Mac下的UI自动化测试 (一)
在我看来,实现UI自动化测试的过程一向都是令人快乐的事情,而维护它们就是跟噩梦一样了,尤其是对每次CI产生的build进行BVT测试,由于开发不会告诉你任何UI的变化,那么你拿到的测试结果就势必会一片 ...
- [raspberry pi3] aarch64 mongodb 编译和安装
raspberry pi3官方支持是32bit的系统,使用mongodb的时候有2G数据库大小的限制,32bit的系统上数据大点基本上就可以认为不能用了,所以要装64bit的opensuse. 安装了 ...
- Redhat 6 git服务器配置 (git-daemon)
git-daemon是按照git的自己的git协议进行访问git服务 1.git-daemon软件安装 软件仓库见 redhat 6 git 服务器 配置 (http) 2.配置git dae ...
- 消息队列开发记录笔记-ActiveMQ
1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击a ...
- eclipse jdk安装
在Ubuntu16.04.4安装jdk 转载自:http://www.cnblogs.com/zyrblog/p/8510132.html 一.在Ubuntu16.04.4上安装jdk 1.下载jd ...