编译MatCaffe
使用如下命令编译MatCaffe
- 1
- 1
之后,你可以用以下命令测试MatCaffe:
- 1
- 1
如果你在运行上面命令时,遇到如下错误:libstdc++.so.6 version ‘GLIBCXX_3.4.15’ not found,说明你的Matlab库不匹配。你需要在启动Matlab之前运行如下命令:
- 1
- 2
- 1
- 2
在Caffe根目录启动Matlab之后需要增加路径:
- 1
- 1
你可以使用savepath
来保存Matlab搜索路径,这样下次就不用再添加路径了。
使用MatCaffe
MatCaffe 和 PyCaffe 的使用方法很相似。
下面将用一个例子来解释MatCaffe的具体使用细节,假设你已经下载了BVLC CaffeNet,并且在caffe根目录启动matlab。
- 1
- 2
- 3
- 1
- 2
- 3
1.设置模式和设备
模式和设备的设置必须在创建一个net或solver之前。
使用CPU:
- 1
- 1
使用GPU并指定gpu_id:
- 1
- 2
- 1
- 2
2.创建一个网络并访问它的layers和blobs
1.创建网络
创建一个网络:
- 1
- 1
或者
- 1
- 2
- 1
- 2
它可以创建一个如下的net对象:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
两个containers.Map
对象可以通过layer或者blob的名称找到对应的索引。
2.访问blob
你可以访问网络中的每一个blob,将data
的blob填充为全一:
- 1
- 1
将data
的blob中数值全部乘以10:
- 1
- 1
注意:因为Matlab是以1作为起始单元,且以列为主,在Matlab中使用四维blob为[width, height, channels, num],且width是最快的维度,而且要在BGR通道。而且Caffe使用单精度浮点型数据。如果你的数据不是浮点型的,set_data
将会自动转换为single。
3.访问layer
你也可以访问网络的每一层,以便你作一些网络调整。例如把conv1
参数乘以10:
- 1
- 2
- 1
- 2
你也可以如下代码:
- 1
- 2
- 1
- 2
4.保存网络
你仅仅需要如下代码保存网络:
- 1
- 1
5.获得一层的类型(string)
- 1
- 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);
)产生输入数据后,你可以运行:
- 1
- 2
- 1
- 2
或者
- 1
- 2
- 3
- 1
- 2
- 3
后向计算使用net.backward
或者net.backward_prefilled
,并且把get_data
和set_data
替换为get_diff
和set_diff
。在通过一些方法(例如prob_diff = rand(net.blobs('prob').shape);
)产生输出blobs的梯度后,你可以运行:
- 1
- 2
- 1
- 2
或者
- 1
- 2
- 3
- 1
- 2
- 3
然而,如上的后向计算并不能得到正确的结果,因为Caffe默认网络不需要后向计算。为了获取正确的后向计算结果,你需要在你的网络prototxt文件中设置force_backward: true
在完成前向和后向计算之后,你可以获得中间blobs的data和diff。例如,你可以在前向计算后获取pool5
的特征。
4.Reshape
假设你想要运行1幅图像,而不是10幅时:
- 1
- 2
- 1
- 2
然后,整个网络就reshape了,此时net.blobs('prob').shape
应该是[1000 1];
5.训练网络
假设你按照ImageNET Tutorial的方法创建了训练lmdb和验证lmdb,产生一个solver并且在ILSVRC 2012 分类数据集上训练:
- 1
- 1
这样可以创建一个solver
对象:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
训练代码:
- 1
- 1
如果只想训练迭代1000次:
- 1
- 1
来获取迭代数量:
- 1
- 1
来获取这个网络:
- 1
- 2
- 1
- 2
假设从一个snapshot中恢复网络训练:
- 1
- 1
6.输入和输出
caffe.io
类提供了基本的输入函数load_image
和read_mean
。例如,读取ILSVRC 2012 mean文件(假设你已经通过运行./data/ilsvrc12/get_ilsvrc_aux.sh
下载imagenet例程辅助文件)
- 1
- 1
为了读取Caffe例程图片,并且resize到[width, height],且假设width = 256; height = 256;
- 1
- 2
- 1
- 2
注意:width
是最快的维度,通道为BGR,与Matlab存取图片的一般方式不一样。如果你不想要使用caffe.io.load_image
,且想自己导入一幅图片:
- 1
- 2
- 3
- 4
- 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。
################################################################################
本节内容主要是实现,利用matlab调用caffe中的matlab接口,实现matlab环境下caffe 的使用
GCC降级
编译matlab
运行demo
(一)matlab支持gcc较低版本,而ubuntu14.04支持gcc4.8,所以要先将gcc降级
我的是matlab2013a,支持的是gcc4.4.x系列,所以我就安装gcc4.4,然后降级
1.安装gcc4.4
2.降级
3.验证版本
(二)编译matlab
cd 到caffe目录下
测试
出现问题
出现问题的原因:编译caffe时候的库与编译matlab相关的库版本不一样
有一个会在matlab目录下/usr/local/MATLAB/R2013a/sys/os/glnxa64;另外一个在/usr/lib/x86_64-Linux-gnu/libstdc++.so.6
解决措施:
1.(推荐)将matlab下的libstdc++.so.6链接到系统用的那个库的文件去
2.(不推荐)将matlab下的libstdc++.so.6 更改名称为libstd++.so.6_back(让matlab找不到这个,但是为了安全还是备份一下吧),这样在执行matlab编译的时候会自动去找系统用的库
执行测试
(三)caffe中提供了matlab的demo
An ILSVRC image classification demo is in caffe/matlab/demo/classification_demo.m (you need to download BVLC CaffeNet from Model Zoo to run it).
打开matlab,切换目录到caffe-master/matlab/demo目录下,拷贝cat.jpg到此目录下
运行classification_demo.m,得到1000*1的输出 因为imagnet一共1000类,输出的1000维就是每一类的输出,最大值就是对应的类别