编译MatCaffe

使用如下命令编译MatCaffe

make all matcaffe

之后,你可以用以下命令测试MatCaffe:

make mattest

如果你在运行上面命令时,遇到如下错误: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

在Caffe根目录启动Matlab之后需要增加路径:

addpath ./matlab

你可以使用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.设置模式和设备

模式和设备的设置必须在创建一个net或solver之前。

使用CPU:

caffe.set_mode_cpu();

使用GPU并指定gpu_id:

caffe.set_mode_gpu();
caffe.set_device(gpu_id);

2.创建一个网络并访问它的layers和blobs

1.创建网络

创建一个网络:

net = caffe.Net(model, weights, 'test'); % create net and load weights

或者

net = caffe.Net(model, 'test'); % create net but not load weights
net.copy_from(weights); % load weights

它可以创建一个如下的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}

两个containers.Map对象可以通过layer或者blob的名称找到对应的索引。

2.访问blob

你可以访问网络中的每一个blob,将data的blob填充为全一:

net.blobs('data').set_data(ones(net.blobs('data').shape));

data的blob中数值全部乘以10:

net.blobs('data').set_data(net.blobs('data').get_data() * 10);

注意:因为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

你也可以如下代码:

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);

4.保存网络

你仅仅需要如下代码保存网络:

net.save('my_net.caffemodel');

5.获得一层的类型(string)

layer_type = net.layers('conv1').type;

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};

或者

net.blobs('data').set_data(data);
net.forward_prefilled();
prob = net.blobs('prob').get_data();

后向计算使用net.backward或者net.backward_prefilled,并且把get_dataset_data替换为get_diffset_diff。在通过一些方法(例如prob_diff = rand(net.blobs('prob').shape);)产生输出blobs的梯度后,你可以运行:

res = net.backward({prob_diff});
data_diff = res{1};

或者

net.blobs('prob').set_diff(prob_diff);
net.backward_prefilled();
data_diff = net.blobs('data').get_diff();

然而,如上的后向计算并不能得到正确的结果,因为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();

然后,整个网络就reshape了,此时net.blobs('prob').shape应该是[1000 1];

5.训练网络

假设你按照ImageNET Tutorial的方法创建了训练lmdb和验证lmdb,产生一个solver并且在ILSVRC 2012 分类数据集上训练:

solver = caffe.Solver('./models/bvlc_reference_caffenet/solver.prototxt');

这样可以创建一个solver对象:

  Solver with properties:net: [1x1 caffe.Net]test_nets: [1x1 caffe.Net]

训练代码:

solver.solve();

如果只想训练迭代1000次:

solver.step(1000);

来获取迭代数量:

iter = solver.iter();

来获取这个网络:

train_net = solver.net;
test_net = solver.test_nets(1);

假设从一个snapshot中恢复网络训练:

solver.restore('your_snapshot.solverstate');

6.输入和输出

caffe.io类提供了基本的输入函数load_imageread_mean。例如,读取ILSVRC 2012 mean文件(假设你已经通过运行./data/ilsvrc12/get_ilsvrc_aux.sh下载imagenet例程辅助文件)

mean_data = caffe.io.read_mean('./data/ilsvrc12/imagenet_mean.binaryproto');

为了读取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

注意: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

你也可以看一下caffe/matlab/demo/classification_demo.m文件,了解如何将输入图片crop成多个输入块。

你可以查看caffe/matlab/hdf5creation,了解如何通过Matlab读和写HDF5数据。但不提供额外的数据输出函数,因为在Matlab本身已经具有了强大的功能。

7.清除nets和solvers

调用caffe.reset_all()来清理你所创建的所有的solvers,和stand-alone nets。

转载于:https://www.cnblogs.com/lixuebin/p/10814842.html

caffe的Matlab接口的使用方法相关推荐

  1. 集群管理——开机B7问题(内存条ERROR),caffe编译matlab接口错误解决方法

    开机B7问题 之前闲置了一台计算主机,今天开机发现一直卡在SYSTEM initializing 右下角自检显示卡在B7,开不了机进入BIOS都不行.期初以为是BIOS的问题,于是大费周章地拆开机箱, ...

  2. 【caffe-Windows】微软官方caffe之 matlab接口配置

    前言 按照微软的官方地址配置可能会出现一个问题caffe_.mexw64找不到引用模块问题,或者在matlab里面压根找不到caffe_这个函数,下面会提到这两个问题.还是按照步骤来吧 [PS1]有G ...

  3. caffe.net matlab,【caffe-Windows】微软官方caffe之 matlab接口配置

    前言 按照微软的官方地址配置可能会出现一个问题caffe_.mexw64找不到引用模块问题,或者在matlab里面压根找不到caffe_这个函数,下面会提到这两个问题.还是按照步骤来吧 [PS1]有G ...

  4. win7 x64系统配置caffe的matlab接口。

    本文主要内容为转载,结合和在实际中遇到的问题总结而成,亲测可用,转载文章来源 http://m.blog.csdn.net/article/details?id=51702686 . (1)修改配置文 ...

  5. ubuntu16.04 matlab2017b 编译caffe的matlab接口 吐血经历 解决几乎所有make mattest问题

    原本只用编译好的caffe来finetune,不需配置接口,两天就配好了 然而为了中间层输出,要配置matlab接口,花了一个星期才搞定. 服务器的版本情况是: ubuntu16.04 cuda8.0 ...

  6. 微软官方caffe之 matlab接口配置

    前言 按照微软的官方地址配置可能会出现一个问题caffe_.mexw64找不到引用模块问题,或者在matlab里面压根找不到caffe_这个函数,下面会提到这两个问题.还是按照步骤来吧 [PS1]有G ...

  7. (转)如何使用caffe的MATLAB接口

    编译MatCaffe 转自: http://blog.csdn.net/ws_20100/article/details/50525879 使用如下命令编译MatCaffe make all matc ...

  8. ubuntu14.04matlab2015b 测试caffe的Matlab接口

    Step1: 修改caffe-master中的Makefile.config 提示:可以到文件中直接"ctrl+f",键入相应大写字母即可查找到相应位置. Step2:编译接口.如 ...

  9. Ubuntu caffe 测试matlab接口

    这是17年8月份新增的: make matcaffe error 255 解决: 在Makefile里面,大约第410行那一句话CXXFLAGS += -MMD -MP下面添加CXXFLAGS += ...

  10. 深度学习之Windows下安装caffe及配置Python和matlab接口

    去年下半年看了相关目标检测的论文,一些传统的算法,一些CVPR,TPAMI,ECCV,ICCV,,NIPS,比较前沿的进展,主要都是基于深度学习卷积神经网络方面的,包括RCNN,SPP-NET,Fas ...

最新文章

  1. 随笔2:关于linux和python
  2. android studio 2.1正式版,Android Studio 1.2 正式版发布
  3. 事件计划自动关闭_首部L3级自动驾驶国际法规之ALKS功能解读
  4. 三种提取 网卡的方法
  5. BZOJ.4144.[AMPPZ2014]Petrol(Kruskal重构树)
  6. java中getClass().getResourceAsStream()与getClass().getClassLoader().getResourceAsStream()的区别
  7. boost::intrusive::splay_set用法的测试程序
  8. html5基础知识点文本标签
  9. python期末知识点_史上最全的Python知识点整理之基本语法
  10. 周敏教授计算机编码与密码学,中国科学院计算机与控制学院博士生导师:张玉清教授...
  11. SparkContext解析
  12. 【转】接口测试面试题
  13. ssr提示服务器名无效_联想服务器在UEFI HII界面中配置阵列的基本操作
  14. dede添加文章php,DEDE伪原创插件 一键导入1.5万替换词数据
  15. Asp.net学习过程分解(学习路线)
  16. 洛谷1156 垃圾陷阱
  17. java毕业生设计学籍管理系统计算机源码+系统+mysql+调试部署+lw
  18. windows无法完成更新正在撤销更改
  19. MATLAB/Simulink封装子模块图片显示和参数输出设置问题
  20. android+5.0+root,人生在于折腾:Android 5.0再次闪电Root 附Root方法

热门文章

  1. apache 2.4.4 自动分割日志,按年月日生成
  2. 阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils
  3. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置
  4. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_10idea集成maven插件...
  5. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_4_Object类中wait带参方法和notifyAll方法...
  6. 【转】PP模块快速入门之功能简介
  7. WildPacket AiroPeek EtherPeek OmniPeek
  8. SiteMesh配置下载使用(简单介绍)
  9. Codeforces Round #580 (Div. 1)(CF1205)A-E
  10. 二维凸包 Graham扫描算法