(转)如何使用caffe的MATLAB接口
編譯MatCaffe
轉(zhuǎn)自:?http://blog.csdn.net/ws_20100/article/details/50525879
使用如下命令編譯MatCaffe
make all matcaffe- 1
之后,你可以用以下命令測試MatCaffe:
make mattest- 1
如果你在運(yùn)行上面命令時,遇到如下錯誤:libstdc++.so.6 version ‘GLIBCXX_3.4.15’ not found,說明你的Matlab庫不匹配。你需要在啟動Matlab之前運(yùn)行如下命令:
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的具體使用細(xì)節(jié),假設(shè)你已經(jīng)下載了BVLC CaffeNet,并且在caffe根目錄啟動matlab。
model = './models/bvlc_reference_caffenet/deploy.prototxt'; weights = './models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel';- 1
- 2
- 3
1.設(shè)置模式和設(shè)備
模式和設(shè)備的設(shè)置必須在創(chuàng)建一個net或solver之前。
使用CPU:
caffe.set_mode_cpu();- 1
使用GPU并指定gpu_id:
caffe.set_mode_gpu(); caffe.set_device(gpu_id);- 1
- 2
2.創(chuàng)建一個網(wǎng)絡(luò)并訪問它的layers和blobs
1.創(chuàng)建網(wǎng)絡(luò)
創(chuàng)建一個網(wǎng)絡(luò):
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
它可以創(chuàng)建一個如下的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的名稱找到對應(yīng)的索引。
2.訪問blob
你可以訪問網(wǎng)絡(luò)中的每一個blob,將data的blob填充為全一:
net.blobs('data').set_data(ones(net.blobs('data').shape));- 1
將data的blob中數(shù)值全部乘以10:
net.blobs('data').set_data(net.blobs('data').get_data() * 10);- 1
注意:因?yàn)镸atlab是以1作為起始單元,且以列為主,在Matlab中使用四維blob為[width, height, channels, num],且width是最快的維度,而且要在BGR通道。而且Caffe使用單精度浮點(diǎn)型數(shù)據(jù)。如果你的數(shù)據(jù)不是浮點(diǎn)型的,set_data將會自動轉(zhuǎn)換為single。
3.訪問layer
你也可以訪問網(wǎng)絡(luò)的每一層,以便你作一些網(wǎng)絡(luò)調(diào)整。例如把conv1參數(shù)乘以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.保存網(wǎng)絡(luò)
你僅僅需要如下代碼保存網(wǎng)絡(luò):
net.save('my_net.caffemodel');- 1
5.獲得一層的類型(string)
layer_type = net.layers('conv1').type;- 1
3.前向和后向計算
前向和后向計算可以使用net.forward或者net.forward_prefilled實(shí)現(xiàn)。函數(shù)net.forward將一個包含輸入blob(s)的cell數(shù)組作為輸入,并輸出一個包含輸出blob(s)的cell數(shù)組。函數(shù)net.forward_prefilled將使用輸入blob(s)中的已有數(shù)據(jù)進(jìn)行計算,沒有輸入數(shù)據(jù),沒有輸出數(shù)據(jù)。
在通過一些方法(如:data = rand(net.blobs('data').shape);)產(chǎn)生輸入數(shù)據(jù)后,你可以運(yùn)行:
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);)產(chǎn)生輸出blobs的梯度后,你可以運(yùn)行:
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
然而,如上的后向計算并不能得到正確的結(jié)果,因?yàn)镃affe默認(rèn)網(wǎng)絡(luò)不需要后向計算。為了獲取正確的后向計算結(jié)果,你需要在你的網(wǎng)絡(luò)prototxt文件中設(shè)置force_backward: true
在完成前向和后向計算之后,你可以獲得中間blobs的data和diff。例如,你可以在前向計算后獲取pool5的特征。
4.Reshape
假設(shè)你想要運(yùn)行1幅圖像,而不是10幅時:
net.blobs('data').reshape([227 227 3 1]); % reshape blob 'data' net.reshape();- 1
- 2
然后,整個網(wǎng)絡(luò)就reshape了,此時net.blobs('prob').shape應(yīng)該是[1000 1];
5.訓(xùn)練網(wǎng)絡(luò)
假設(shè)你按照ImageNET Tutorial的方法創(chuàng)建了訓(xùn)練lmdb和驗(yàn)證lmdb,產(chǎn)生一個solver并且在ILSVRC 2012 分類數(shù)據(jù)集上訓(xùn)練:
solver = caffe.Solver('./models/bvlc_reference_caffenet/solver.prototxt');- 1
這樣可以創(chuàng)建一個solver對象:
Solver with properties:net: [1x1 caffe.Net]test_nets: [1x1 caffe.Net]- 1
- 2
- 3
- 4
訓(xùn)練代碼:
solver.solve();- 1
如果只想訓(xùn)練迭代1000次:
solver.step(1000);- 1
來獲取迭代數(shù)量:
iter = solver.iter();- 1
來獲取這個網(wǎng)絡(luò):
train_net = solver.net; test_net = solver.test_nets(1);- 1
- 2
假設(shè)從一個snapshot中恢復(fù)網(wǎng)絡(luò)訓(xùn)練:
solver.restore('your_snapshot.solverstate');- 1
6.輸入和輸出
caffe.io類提供了基本的輸入函數(shù)load_image和read_mean。例如,讀取ILSVRC 2012 mean文件(假設(shè)你已經(jīng)通過運(yùn)行./data/ilsvrc12/get_ilsvrc_aux.sh下載imagenet例程輔助文件)
mean_data = caffe.io.read_mean('./data/ilsvrc12/imagenet_mean.binaryproto');- 1
為了讀取Caffe例程圖片,并且resize到[width, height],且假設(shè)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,且想自己導(dǎo)入一幅圖片:
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數(shù)據(jù)。但不提供額外的數(shù)據(jù)輸出函數(shù),因?yàn)樵贛atlab本身已經(jīng)具有了強(qiáng)大的功能。
7.清除nets和solvers
調(diào)用caffe.reset_all()來清理你所創(chuàng)建的所有的solvers,和stand-alone nets。
轉(zhuǎn)載于:https://www.cnblogs.com/byteHuang/p/7492633.html
總結(jié)
以上是生活随笔為你收集整理的(转)如何使用caffe的MATLAB接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java并发编程(十七)内存操作总结
- 下一篇: ES6 正则的扩展