1. 程式人生 > >深度學習Caffe實戰(9)Windows 平臺caffe用MATLAB介面實現訓練網路和測試

深度學習Caffe實戰(9)Windows 平臺caffe用MATLAB介面實現訓練網路和測試

上一篇介紹了網路協議中各個引數的作用,知道了各個引數的作用,想必應該可以嘗試修改網路結構了。前幾篇部落格介紹的都是用命令列訓練和測試網路,這篇部落格介紹如何用MATLAB介面實現訓練和測試網路,window平臺下caffe使用者本來就少,這方面的資料更少了,下一篇部落格介紹如何利用MATLAB提取特徵和視覺化feature map。話不多說,我們開始train

1、MATLAB實現卷積神經網路訓練
開啟MATLAB,進入affe-windows-master\matlab\demo\在這個資料夾下新建自己的資料夾(當然,不新建也行,後面注意路徑就是了),我新建Heroin資料夾,在資料夾下建一個train資料夾,把資料和網路協議都拷貝到這個資料夾下,至於協議檔案怎麼修改,看我之前的部落格寫的很詳細了,,,,
這裡寫圖片描述

然後新建一個matlab指令碼檔案,內容如下:

clear;
clc;
addpath ../../../../matlab   %在不同的資料夾下,這個路徑要注意一下
caffe.reset_all  
caffe.set_mode_cpu();%設定cpu或gpu模式
%caffe_model = 'snapshot/lenet_iter_10000.caffemodel'; %微調使用
solver=caffe.Solver('lenet_solver.prototxt'); %協議檔案所在路徑
%solver.net.copy_from(caffe_model);  %微調使用
% solver.solve(); %一次性訓練
% loss=[]; % accuracy=[]; close all; hold on%畫圖用的 iter_ = solver.iter();%獲取迭代次數 while iter_<10000 solver.step(1);%一步一步迭代 iter_ = solver.iter(); %得到迭代次數 loss=solver.net.blobs('loss').get_data();%取訓練集的loss if iter_==1 loss_init = loss; else if(mod(iter_,1)==0) %每1次繪製一次損失
y_l=[loss_init loss]; x_l=[iter_-1, iter_]; plot(x_l, y_l, 'r-'); drawnow loss_init = loss; end end if mod(iter_, 100) == 0 %100次取一次accuray accuracy=solver.test_nets.blobs('accuracy').get_data();%取驗證集的accuracy if iter_/100 == 1 accuracy_init = accuracy; else x_l=[iter_-100, iter_]; y_a=[accuracy_init accuracy]; plot(x_l, y_a,'g-'); drawnow accuracy_init=accuracy; end end end

上面的MATLAB程式碼我就不多做解釋了,該解釋的地方我都做了詳細的說明了。
執行之後,就能繪製損失函式和精度的曲線了。效果如下:
這裡寫圖片描述

2、用MATLAB介面測試訓練好的模型
話不多說,直接上MATLAB程式碼,這裡用的訓練好的模型是前面部落格裡介紹的用自己的資料訓練的alexnet模型,相應的deploy協議在caffe的model中都能找到,程式碼我都做了註釋了:

clear;
clc;
addpath ../../../../matlab
net = init_net();                      %初始化網路
%im_data = caffe.io.load_image('test0020.jpg');
im_data=imread('test0001.jpg');         %讀入影象
%imshow(im_data);
input_data = {prepare_image(im_data)};  %準備資料,需要裁剪時裁剪資料

%不裁剪時使用reshape操作
%  net.blobs('data').reshape([227 227 3 1]); % 當讀進來一幅影象,不做裁剪操作時,這樣使用
%  net.reshape();

tic
res = net.forward(input_data);    %前向傳播結果
mapnum=2;     %第幾層
crop_num=1;   %第幾張crop_num
feature_partvisual( net,mapnum, crop_num ); %視覺化部分feature map
feature_fullvisual(net,mapnum);             %視覺化全部的feature map

res=res{1};
res = mean(res, 2);  % take average scores over 10 crops  求裁剪的10個batch平均值
toc

[~, idx]= max(res);  %找到最大的一個概率值
disp(idx-1);         %輸出類別標籤
caffe.reset_all();  %關閉所有的網路

init_net函式:

function net = init_net()
caffe.set_mode_cpu();       %設定cpu或者gpu模式
caffe.reset_all();
deploy = 'alexnetdeploy.prototxt';      %測試模型結構
caffe_model = 'cloth_iter_100000.caffemodel';     %訓練好的模型
net = caffe.Net(deploy, caffe_model, 'test');     %三個引數,分別代表,測試結構,訓練好的測試模型,test

資料準備prepare_image函式,這裡我是直接參考了catdemo的程式碼,幾乎沒做修改

function crops_data = prepare_image(im)
% ————————————————————————
% caffe/matlab/+caffe/imagenet/ilsvrc_2012_mean.mat contains mean_data that
% is already in W x H x C with BGR channels
mean_data = caffe.io.read_mean(‘mimg_mean.binaryproto’); %讀入均值檔案
IMAGE_DIM = 227;
CROPPED_DIM = 227;

% Convert an image returned by Matlab’s imread to im_data in caffe’s data
% format: W x H x C with BGR channels
im_data = im(:, :, [3, 2, 1]); % permute channels from RGB to BGR %把RGB轉換成BGR
im_data = permute(im_data, [2, 1, 3]); % flip width and height
im_data = single(im_data); % convert from uint8 to single
im_data = imresize(im_data, [IMAGE_DIM IMAGE_DIM], ‘bilinear’); % resize im_data
im_data = im_data - mean_data; % subtract mean_data (already in W x H x C, BGR)

% oversample (4 corners, center, and their x-axis flips)
crops_data = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, ‘single’);
indices = [0 IMAGE_DIM-CROPPED_DIM] + 1;
n = 1;
for i = indices
for j = indices
crops_data(:, :, :, n) = im_data(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :);
crops_data(:, :, :, n+5) = crops_data(end:-1:1, :, :, n);
n = n + 1;
end
end
center = floor(indices(2) / 2) + 1;
crops_data(:,:,:,5) = …
im_data(center:center+CROPPED_DIM-1,center:center+CROPPED_DIM-1,:);
crops_data(:,:,:,10) = crops_data(end:-1:1, :, :, 5);

% %視覺化影象
% cat_map=zeros(CROPPED_DIM*2,CROPPED_DIM*5,3);%兩行五列展示
% cat_num=0;
% for i=0:1
% for j=0:4
% cat_num=cat_num+1
% cat_map(CROPPED_DIM*i+1:(i+1)*CROPPED_DIM,CROPPED_DIM*j+1:(j+1)*CROPPED_DIM,:)=crops_data(:,:,:,cat_num);
% end
% end
% imshow(uint8(cat_map))

說明:裁剪部分是按照catdemo做的,把輸入的一幅圖四個角和中間分別裁剪,然後旋轉180度,這樣每幅圖片都成了10張圖,測試的時候分別計算每張圖softmax的結果,求平均,更多關於裁剪的知識,請查閱相關資料,這裡只介紹實戰。也可以不使用crop,需要遮蔽掉呼叫crop函式,使用程式碼中不crop的部分。
另外,這部分程式碼中有特徵提取和視覺化部分,是下一篇部落格要介紹的內容,大家自行忽略特徵提取和視覺化部分就行啦。程式碼部分我都做了註釋,很好理解了!

測試部分的檔案結構如下:
這裡寫圖片描述

最後能計算出測試影象的標籤:

這裡寫圖片描述

標籤1對應短袖。測試圖片如下:
這裡寫圖片描述