2019-05-15 Matconvnet里提取resnet的特

2019-09-29  本文已影响0人  whisper330

想借用MFT的代码进行学习,但是无奈调不通。现在换一种思路试试看。
参考链接:
1.深度学习(十二):Matconvnet小试牛刀与提特征
2.【深度学习】基于MatConvNet框架的CNN卷积层与特征图可视化
3.zhanghang1989
4.使用 GoogLeNet 对图像进行分类
5.Build Deep Learning Models with MATLAB

根据参考链接四得到的灵感,在matlab命令行输入

net=resnet50;

然后会显示下面这种情况(如果没有,那么恭喜你,你可能在某种不知名的时刻已经下载该工具包了)



点击Add-on Explorer,然后下载相应工具包,如下所示



登陆账号,点击下载,安装配置界面如下所示:

接下来,新建一个脚本,代码如下:

net = resnet50;
inputSize = net.Layers(1).InputSize;  %获得网络的标准输出
classNames = net.Layers(end).ClassNames;     %得到1000个分类标签名字
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)));  %随机显示10个分类标签
I = imread('peppers.png');
figure
imshow(I)
I = imresize(I,inputSize(1:2));    %把图片变成网络输入所需大小
figure
imshow(I)
[label,scores] = classify(net,I);   %这个是得到结果的关键函数
figure
imshow(I)
title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");

运行之后出错,错误使用gpuArray/hTimesTranspose,是gpu之类的问题(我应该是没有配置好)


然后将DAGNetwork里面Line262改成GPUShouldBeUsed = 0;把GPU模式关了,竟然成功了,哈哈哈

用Resnet提取特征
如果你需要得到每一层的值,你可以将DAGNetwork.m里面的Line340行注释掉,这一层的功能是将上一层的数据删除掉,释放空间(源代码只是为了得到最后一层分类层的数据,所以其他的不重要)。

                activationsBuffer = iAssignActivationsToBuffer( ...
                    activationsBuffer, ...
                    this.ListOfBufferOutputIndices{i}, ...
                    outputActivations);
                
%                 activationsBuffer = iClearActivationsFromBuffer( ...
%                     activationsBuffer, ...
%                     this.ListOfBufferIndicesForClearingForward{i});
activationsBuffer就是每一层的weight的值,把它输出即可。部分如下图所示
上一篇 下一篇

猜你喜欢

热点阅读