该节简单介绍一下如何使用Matconvnet的现有的模型进行图像分类实验以及提取图像对应层的特征。

先来看看如何用训练好的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)) ;

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

再来看一下另一种DAG 模型:

从新建一个m脚本代码如下:

% load the pre-trained CNN
net = dagnn.DagNN.loadobj(load('imagenet-vgg-f.mat')) ;
% 切换到test模式
net.mode = 'test' ;% load and preprocess an image
im = imread('peppers.png') ;
im_ = single(im) ; % note: 0-255 range
im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
im_ = bsxfun(@minus, im_, net.meta.normalization.averageImage) ;%运行网络,可以看到和simple模式还是不一样的
% 输入是 x0
% run the CNN
net.eval({'x0', im_}) ;%输出是x21
% obtain the CNN otuput
scores = net.vars(net.getVarIndex('x21')).value ;
scores = squeeze(gather(scores)) ;%显示
% show the classification results
[bestScore, best] = max(scores) ;
figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',...
net.meta.classes.description{best}, best, bestScore)) ;

可以看到的是,依然是上述的结果,就不贴了,这里只是说几点需要注意且容易错的地方:

(1) 就是输入”x0”
可能会问为什么是x0呢?不同的网络模型还真不一样,这里我们在matlab下观看net这个网络变量可以看到如下:

可以发现这个网络把输入定义为‘x0’,把最终的输出定义为‘x21’了,所以才会有程序那样。那么中间的是什么呢,各种卷积层全连接层,显然这是不太好看的,所以一般情况下会把这个名字改一下,因为这个vgg网络原因,本身是给simple用的就没有改。

上面是我运行以后的结果,右边可以看大,这个结果只保留了最后1000类预测的得分,中间的卷积层呀,全连接层的特征都为空[],这是默认情况下为了节省内存有意设置的。但是有些时候,我们不光要得到最后的分类概率,还想把中间的特征抠出来作为特征来进行其他分类应用,这个时候就需要将所有的特征显示出来,调用的参数为:conserveMemory [true](注意这是在使用DagNN 的模式下)

也就是说当你在测试一个样本的时候,使用了eval以后,得到的结果里面默认不会保存卷积的值,只有最终prop的概率值,因为默认conserveMemory =1,这个时候想要获得各个层包括卷基层等等的输出值,只需要把conserveMemory =0即可,

还是以上面的vgg-f网络为例:

% load the pre-trained CNN
net = dagnn.DagNN.loadobj(load('imagenet-vgg-f.mat')) ;
% 切换到test模式
net.mode = 'test' ;% load and preprocess an image
im = imread('peppers.png') ;
im_ = single(im) ; % note: 0-255 range
im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
im_ = bsxfun(@minus, im_, net.meta.normalization.averageImage) ;%运行网络,可以看到和simple模式还是不一样的
% 输入是 x0
% run the CNN
net.conserveMemory = 0;   %将特征都显示出来
net.eval({'x0', im_}) ;%输出是x21
% obtain the CNN otuput
scores = net.vars(net.getVarIndex('x21')).value ;
scores = squeeze(gather(scores)) ;%显示
% show the classification results
[bestScore, best] = max(scores) ;
figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',...
net.meta.classes.description{best}, best, bestScore)) ;

这个时候可以看到:

所有的特征都出来了,剩下的只是把它抠出来再利用了。

深度学习(十二):Matconvnet小试牛刀与提特征相关推荐

  1. 花书+吴恩达深度学习(二十)构建模型策略(超参数调试、监督预训练、无监督预训练)

    目录 0. 前言 1. 学习率衰减 2. 调参策略 3. 贪心监督预训练 4. 贪心逐层无监督预训练 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十 ...

  2. PyTorch框架学习十二——损失函数

    PyTorch框架学习十二--损失函数 一.损失函数的作用 二.18种常见损失函数简述 1.L1Loss(MAE) 2.MSELoss 3.SmoothL1Loss 4.交叉熵CrossEntropy ...

  3. 用MXnet实战深度学习之二:Neural art

    用MXnet实战深度学习之二:Neural art - 推酷 题注:本来这是第三集的内容,但是 Eric Xie 勤劳又机智的修复了mxnet和cuDNN的协作问题,我就把这篇当作一个卷积网络Conv ...

  4. 图说2016深度学习十大指数级增长

    转自:https://www.52ml.net/21402.html http://mp.weixin.qq.com/s?__biz=MzI3MTA0MTk1MA==&mid=26519906 ...

  5. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  6. 2017年深度学习十大趋势预测

    2017年深度学习十大趋势预测 本文作者曾经多次预测了技术发展的趋势,最近的一次预测是"2011年软件发展的趋势与预测".10项预言中,准确地命中了6项,比如JavaScript ...

  7. NLP:LSTM之父眼中的深度学习十年简史《The 2010s: Our Decade of Deep Learning / Outlook on the 2020s》的参考文献

    NLP:LSTM之父眼中的深度学习十年简史<The 2010s: Our Decade of Deep Learning / Outlook on the 2020s>的参考文献 目录 T ...

  8. OpenCV与图像处理学习十二——图像形状特征之HOG特征

    OpenCV与图像处理学习十二--图像形状特征之HOG特征 一.图像特征理解 1.1 颜色特征 1.2 纹理特征 1.3 形状特征 1.4 空间关系特征 二.形状特征描述 2.1 HOG特征 2.1. ...

  9. libevent源码深度剖析十二

    libevent源码深度剖析十二 --让libevent支持多线程 张亮 Libevent本身不是多线程安全的,在多核的时代,如何能充分利用CPU的能力呢,这一节来说说如何在多线程环境中使用libev ...

最新文章

  1. Tensorflow中的mnist例子
  2. php广告轮播效果,使用swiper组件实现轮播广告效果
  3. 歌手比赛系统c语言程序注释,C语言程序课程设计—歌手比赛系统(20页)-原创力文档...
  4. Android中自定义View的研究 -- 在XML中引用自定义View
  5. VMware Workstation 12新建虚拟机
  6. 为什么MySQL数据库要用B+树存储索引
  7. 用计算机表白的数字,用数字表白的句子大全 如何用数字表白一段话
  8. linux svn 备份脚本,SVN热备份脚本
  9. linux nginx django,如何在Linux下使用Nginx部署Django项目
  10. WCF 安全性 之 None
  11. 做一个小淘气轮廓--文章和论文专辑
  12. abaqus 关联 子程序_Abaqus2016版本关联子程序教程
  13. 摄影基础知识——光圈
  14. 个人自我介绍PPT模板推荐
  15. rust多行字符串字面量
  16. mac 提示文件已损坏 解决办法
  17. 数学竞赛倒计时23天_变上限下限积分求导法则
  18. 对一些内存名词术语的解释(bank ECC等)——转载
  19. UltraEdit打开文件,中文显示为乱码的解决方法
  20. Selenium2Library 主要关键字

热门文章

  1. 从保险科技看数字化如何改变保险行业
  2. 记录使用centos7桌面版-添加中文拼音
  3. 让MCU低功耗的五点
  4. 神经网络的模型参数调优的方法有哪些
  5. 陕西专科计算机学校排名2015,陕西省职业学校2017排名
  6. 电表远程抄表系统的扩展性
  7. c语言csae中没有break,switch语句内容,到底是哪里错了呢?
  8. metal分析是什么意思_metal是什么意思
  9. h5调用安卓原生相机、相册、电话、录像,且兼容安卓系统8.0
  10. 动态环境下的slam问题如何解决?