想借用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的值,把它输出即可。部分如下图所示

网友评论