2025年如何使用VGG16提取某层的特征?

如何使用VGG16提取某层的特征?1 VGG16 网络结构图 VGG16 结构为 卷积层 全连接层 13 3 16 1 卷积层 由上图可知分为 5 个部分共 13 层 即 conv1 conv5 2 三个全连接层 即 fc6 fc7 fc8 这个 VGG16 网络就是基于 ImageNet 数据集来的

大家好,我是讯享网,很高兴认识大家。

 1、VGG16网络结构图

VGG16网络结构图
讯享网

VGG16结构为:卷积层 + 全连接层=13 + 3 = 16
1、卷积层:由上图可知分为5个部分共13层,即conv1~conv5
2、三个全连接层,即fc6、fc7、fc8
这个VGG16网络就是基于ImageNet数据集来的;它的数据集的类数为1000类;对应fc8层的输出1000
fc6和fc7的输出维数都为4096;因此如果要训练自己的数据集;fc8层的输出维数要根据数据集的类数进行修改
3、对于网络的参数,我们最好还是使用原始的网络参数;毕竟还是很靠谱的;而且还可以节约训练时间

2、使用VGG16提取特征

这里就要选择使用那一层网络提取特征了;但是如何获取对应层的所提取的特征呢?
就要用到activations()

features = activations(net,X,layer) features = activations(net,X,layer,Name,Value)

讯享网

1、features = activations(net,X,layer) 使用受过训练的网络net和X中的数据返回特定层的网络激活。此功能仅支持具有图像输入层的网络。返回某个网络的某一层的某一张图片的激活)只支持一张输入图片!!!

2、features = activations(net,X,layer,Name,Value) 返回特定层的网络激活,以及由一个或多个名称-值对参数指定的其他选项。 例如,``OutputAs'',``rows''将激活输出格式指定为``rows''。 在所有其他输入参数之后指定名称/值对参数。

名称-值对参数:

指定可选的以逗号分隔的Name,Value参数对。 Name是参数名称,Value是相应的值。 名称必须出现在引号中。可以按任意顺序指定多个名称和值对参数,例如Name1,Value1,...,NameN,ValueN。

Example: activations(net,X,layer,'OutputAs','rows')

输入参数

'OutputAs' — Format of output activations
'channels' (default) | 'rows' | 'columns'

'MiniBatchSize' — Size of mini-batches
128 (default) | positive integer

'ExecutionEnvironment' — Hardware resource
'auto' (default) | 'gpu' | 'cpu'

输出参数:

features — Activations from a network layer
n-by-m matrix | m-by-n matrix | h-by-w-by-c-by-n array

根据“ OutputAs”名称-值对参数的值,从网络层进行的激活作为以下之一返回。

trainedFeatures 'OutputAs' value
n-by-m matrix 'rows'
m-by-n matrix 'columns'
h-by-w-by-c-by-n array 'channels'

3、使用VGG16提取特征

讯享网% 加载数据集 unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); % 切分训练集和测试集合 [imdsTrain,imdsTest] = splitEachLabel(imds,0.8,'randomized'); % 计算训练集的数目 numTrainImages = numel(imdsTrain.Labels) % 随机置换操作;将图像的序号打乱 idx = randperm(numTrainImages,16) % 绘制数据集中的图像 figure for i = 1:16 % 4行4列,然后序号从1开始 subplot(4,4,i) I = readimage(imdsTrain,idx(i)); imshow(I) end net = vgg16; net.Layers; inputSize = net.Layers(1).InputSize % 进行修改图像尺寸的操作 augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest); % 获取fc7层的特征 layer = 'fc7'; featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows'); featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows'); % 训练集和测试集的标签 YTrain = imdsTrain.Labels; YTest = imdsTest.Labels; % svm分类器,使用训练数据训练的SVM classifier = fitcecoc(featuresTrain,YTrain); % 预测类别 YPred = predict(classifier,featuresTest); % 指定查询图像的标签 idx = [1 5 11 15]; figure for i = 1:numel(idx) subplot(2,2,i) I = readimage(imdsTest,idx(i)); label = YPred(idx(i)); imshow(I) title(char(label)) end % 精确度为几个测试结果的平均值 % mean数组的均值 accuracy = mean(YPred == YTest)

 

最后accuracy=1

4、如何对提取的特征进行进一步处理

这里就有很多操作了;比如PCA;就是对特征进行降维处理;减少计算量的同时提升速度!!!同样也会提高识别的准确率等等!

我们这里先说一个;

PCA:主成分分析

% reduce demension by PCA, recomend to reduce it to 128 dimension. [coeff, score, latent] = pca(feat); feat = feat*coeff(:, 1:128);

假设feat就是你上一步操作获取的特征;fc7层的维度为4096;我们可以降维到128等;根据实际需求来!

未完待续。。。欢迎一起学习!

小讯
上一篇 2025-01-05 16:35
下一篇 2025-03-08 15:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/27944.html