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

article/2025/8/18 3:53:03

该节简单介绍一下如何使用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)) ;

这个时候可以看到:
这里写图片描述

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


http://chatgpt.dhexx.cn/article/xDJY9XN3.shtml

相关文章

项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)

1、项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一。它合并两个图像, 即 内容图像 C(content image) 和 样式图像S(style image), 以生成图像 G(generated image)。生成的图像 G 将图像 C 的 内…

Matconvnet学习笔记

Introduction to Matconvnet MatConvNet是实现用于计算机视觉领域的卷积神经网络(CNN)的MATLAB工具箱。自从取得突破性工作以来,CNN在计算机视觉领域有一个重大影响,特别是图像理解,基本上取代了传统图像表示。有许多其他机器学习、深度学习和CNN开源库的…

20190812_解决anaconda下install库的问题

20190812_解决anaconda下install库的问题 一、起因二、开始解决三、解决方法1 创建虚拟环境2 在环境中安装库3 重新配置pycharm中的解释器4 运行5 其他 一、起因 在学习PYQT5例子时,需要在anaconda下使用plotly库 二、开始解决 使用: conda install …

matlab已停止工作 win7 64,win7系统笔记本运行软件弹出“Matlab已停止工作”的解决方法...

很多小伙伴都遇到过win7系统笔记本运行软件弹出“Matlab已停止工作”的困惑吧,一些朋友看过网上零散的win7系统笔记本运行软件弹出“Matlab已停止工作”的处理方法,并没有完完全全明白win7系统笔记本运行软件弹出“Matlab已停止工作”是如何解决的&#…

Map遍历方法及效率

在大学的时候记得学过通过迭代器进行Map的遍历,但是从参加工作后,基本都是通过for循环遍历,没用过迭代器,于是去了解了Map的几种遍历方法并通过运行测试各自的速度。 注意:这里只讲通过遍历同时能过获取key和value的遍…

java map集合如何遍历效率高 java中Map遍历的方式

java map集合如何遍历效率高 java中Map遍历的方式 一、前言 1、在看 《阿里巴巴java开发手册》时候,有一条推荐的规约: 【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次&#xff0c…

【Java】Map遍历key-value的四种方法

Map遍历key-value的四种方法 (1)先用keySet()取出所有key值,再取出对应value——增强for循环遍历 (2)先用keySet()取出所有key值,再取出对应value——使用迭代器遍历 (3)通过entryS…

SVM——核函数

我们知道,SVM相对感知机而言,它可以解决线性不可分的问题,那么它是怎么解决的呢?它的解决思想很简单,就是对原始数据的维度变换,一般是扩维变换,使得原样本空间中的样本点线性不可分&#xff0c…

SVM核函数概述

特征空间的隐式映射:核函数 咱们首先给出核函数的来头:在上文中,我们已经了解到了SVM处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间&#x…

聚类算法之核函数

一:监督学习与无监督学习 1,监督学习 监督学习就是人们常说的分类,通过训练已有样本得到一个最优模型,利用该模型将输入转化成输出,对输出进行判断,从而实现分类,也就是具有了对未知数据进行分类…

svm核函数的理解和选择

特征空间的隐式映射:核函数 咱们首先给出核函数的来头:在上文中,我们已经了解到了SVM处理线性可分的情况,而对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间&#x…

matlab rbf核函数,四类核函数(Sigmoid+RBF)

Q:有个疑问就是,模型本身不是线性的,为什么一定要先用线性模型做? A:有核函数和泰勒展开等等,可以无限逼近转化成线性? 小知识: 1.Sigmoid函数,即f(x)=1/(1+e-x)。是神经元的非线性作用函数。广泛应用在神经网络中。又叫Logistic函数。 机器学习中一个重要的预测模型逻辑…

SVM的核函数详解

文章目录 1、核函数背景核函数正式定义 2、高斯核函数2.2 参数带宽 σ \sigma σ的影响2.3高斯核函数的实际意义 2、多项式核函数4、参考资料 1、核函数背景 本文为核函数进阶教程,希望看文章之前最好对核函数有一些最基本的了解,不然有些地方可能会看不…

常见核函数

这篇博文开始的例子就很好地揭示了核函数的简单原理,写得很好! 原地址:https://blog.csdn.net/zkq_1986/article/details/52448238 1 核函数K(kernel function)定义 核函数K(kernel function)就…

CUDA核函数

核函数是指在GPU端运行的代码,核函数内部主要干了什么?简而言之,就是规定GPU的各个线程访问哪个数据并执行什么计算。 文章目录 一、CUDA规范二、核函数内部线程的使用2.1 如何启动核函数 一、CUDA规范 编写核函数必须遵循CUDA规范&#xff…

SVM与核函数

文章目录 核技巧与SVM核函数本质线性可分的SVM与硬间隔最大化SVM对偶算法核技巧高斯核多种不同的核函数比较soft margin 问题核函数 核函数 核技巧与SVM SVM原本是用来解决二分类的分类模型 它和感知机不同的一点是它取到的分类器是在特征空间上的最大间隔的分类器 而为了解决…

核函数(核技巧)

核技巧Kernel trick 背景及含义: 对于 原始样本空间内或许不存在能正确划分两类样本的超平面 问题,考虑 将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。 令 ϕ ( x ) \phi(x) ϕ(x)表示将x映射后的特征向量…

了解核函数

1、核函数定义: 核函数包括线性核函数、多项式核函数、高斯核函数等,其中高斯核函数最常用,可以将数据映射到无穷维,也叫做径向基函数(Radial Basis Function 简称 RBF),是某种沿径向对称的标量…

核函数

对于优化问题: 的求解需要计算这个内积,而如果输入样本线性不可分的话,我们采取的方法是通过函数映射将输入样本映射到另外一个高维空间并使其线性可分。 以库克定律为例(http://zh.wikipedia.org/zh-cn/%E9%9D%99%E7%94%B5%E5%8A%9B)&#x…

什么是核函数?如何理解?

个人理解,核函数的功能就是从低维度的空间向高维度空间转换的函数, 因为在低维空间不可以线性分类的问题到高维度空间就可以线性分类的。 其求法为 低维空间的点映射到高维空间的点后,两个点的内积 就是核函数。 ~~~~~~~~~~~~~~~~~~~~~~~~…