matconvnet简介安装与使用

转自博客:http://blog.csdn.net/on2way/article/details/52959102

十个值得一试的开源深度学习框架

各类框架自己去选择吧,这里想说一下的是其中一个用于研究领域较多的一个框架Matconvnet,这个框架是基于matlab写的,matlab懂得,研究用的,方便简单。

首先贴一下

Matconvnet的主页

(众多说明教程都可以去里面找到)

点进去就可以下载安装包了。

下载完解压到一个路径,接着就到安装这一步了。 
安装之前确认需要安装: 
(1)vs安装; 
(2)需要用GPU加速的还需要安装cuda;

紧接着用Matlab打开到这个解压路径,安装。步骤就不重复了,贴上网络资源:

MatConvNet教程—– Win7下编译和配置详解

ok上述两个介绍的很详细了,关于编译cpu版本还是GPU版本都有说到,编译完以后,理论上没问题应该是在安装目录下的mex下,多出一系列的.mexw64 编译文件,(64位系统),如果没有就证明没有编译成功。

这里写图片描述

我编译的时候提示有几个函数一直重名,不知道为什么,后来我改了几个函数的名字就可以了,像下面这样,也不知道为什么,如果没有这个错误的同学,自动略过吧: 
这里写图片描述

Ok假设都编译完了,如果有的人电脑实在各种问题编译不出来,我把我编译的cpu与Gpu版本都的放一下:

Matconvnet cpu版本 (64位系统)

Matconvnet gpu版本 (cuda7.5编译64位系统)

先来看看如何用训练好的imagenet网络模型进行图像的预测,英文版的官网教程就在这里:

http://www.vlfeat.org/matconvnet/quick/

检测图像分类之前,首先需要训练好的模型,官网也提供了各式各样的网络模型,下载如下:

http://www.vlfeat.org/matconvnet/pretrained/

这里可以看到一堆的模型,我们先下载一个“imagenet-vgg-f ”试一下,

就放在安装包文件夹外面 
这里写图片描述

好了,将matconvnet整个文件夹添加到路径(假设已经编译好了)。

在这个目录下建一个m函数,输入下面代码,运行就可以了:


% Load a model and upgrade it to MatConvNet current version.
% 导入下载的模型
net = load('imagenet-vgg-f.mat') ;
%将其变为simplenn的网络
%matconvnet有两种网络:还有一种为DAG 模型,
% 两个网络的不同之处在于将网络以不同的形式显示出来,后者DAG 会更直观
net = vl_simplenn_tidy(net) ;

% Obtain and preprocess an image.
%读一张图,matlab自带
im = imread('peppers.png') ;
im_ = single(im) ; % note: 255 range
%归一化大小
im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
% 减去图像均值,这个是输入都需要做的一项预处理工作
im_ = im_ - net.meta.normalization.averageImage ;

% Run the CNN.
% 然后把图像带进去运行一下就ok了
res = vl_simplenn(net, im_) ;

%把结果显示出来
% Show the classification result.
scores = squeeze(gather(res(end).x)) ;
[bestScore, best] = max(scores) ;
figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',...
   net.meta.classes.description{best}, best, bestScore)) ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

这里写图片描述

最高得分0.704,结果为辣椒。还可以。

MatConvNet中mnist源码解析

可以自己去看代码,就不解释了。这里假设代码看懂了,那么我抽象出来这个模型结构就像下面这样: 
matconvnet简介安装与使用_第1张图片

可以这个模型的结构依次为:输入-卷积1-pool1-卷积2-pool2-卷积2-relu-卷积4(也可以是全连接层)-sofrmax分类。

根据代码中的结构定义,我们也可以推算出每一层的输出大小(上述图)。

这里需要注意的是,这个网络层的设计大小一定要吻合。比如,经过一系列的卷积pool后,到全连接层时,输入一定要是1*1*X*X,且上一层的map,和下一层的卷积数map一定要一样。比如输入为28*28*1,那么第一个卷积核是5*5*1*20,这个1就是上一层的只有一个图。再往下走卷积为5*5*20*50,这里为什么是20,因为上一层的map有20个。一次类推,计算到最后正好为1*1*500,这样才可以全连接层。如果你自己设计网络,自己计算一下一定要保证后面全连接层时输入为1*1*X*X,否则会训练错误。

Ok,这里说到这,下面在更直观看下网上别人分享的一个网络(当然输入大小错了,中间大小也错了,但是结构类似)

matconvnet简介安装与使用_第2张图片

好了,模型训练完了,那么怎么测试呢? 
这个数据集本身也分了训练集与测试集,下面我们来测试一下测试集的准确率。建一个m脚本,函数如下:


% 导入全体数据
load('D:\myself\matlab\matlab_documents\matconvnet_test\matconvnet\data\mnist-baseline-simplenn\imdb.mat');
% 挑选出测试集
test_index = find(images.set==3);
% 挑选出样本以及真实类别
test_data = images.data(:,:,:,test_index);
test_label = images.labels(test_index);
%导入模型文件
load('D:\myself\matlab\matlab_documents\matconvnet_test\matconvnet\data\mnist-baseline-simplenn\net-epoch-20.mat');

% 将最后一层改为 softmax (原始为softmaxloss,这是训练用)
net.layers{1, end}.type = 'softmax';
% net = vl_simplenn_tidy(net) ;
for i = 1:length(test_label)
    i
    im_ = test_data(:,:,:,i);
    im_ = im_ - images.data_mean;
    res = vl_simplenn(net, im_) ;
    scores = squeeze(gather(res(end).x)) ;
    [bestScore, best] = max(scores) ;
    pre(i) = best;
end
% 计算准确率
accurcy = length(find(pre==test_label))/length(test_label);
disp(['accurcy = ',num2str(accurcy*100),'%']);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

解释一下,中间有一块需要改变最后一层的名字变为softmax,这样才是测试用的。

测试样本可以看到为10000,这样运行一下结果如下:

accurcy = 96.97%

可见准确率还是挺高的。在这个序列的前几篇,曾经也用另外一个深度学习工具箱做过mnist的实验(感兴趣可以去看)

深度学习系列(八):自编码网络多层特征学习

在那里用的是自编码以及pca等方法,都不能得到像现在这样的准确率。


进一步索引对网上大牛对Matconvnet中一些函数的详细解释

MatConvNet 庖丁解牛

注释详细至极,同时这个网站的众多好资源,表示感谢。


最后分享一个网上将这个代码转变为c++代码的测试方法,觉得很好。

C++使用matlab卷积神经网络库MatConvNet来进行手写数字识别



你可能感兴趣的:(Matlab)