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

您所在的位置:网站首页 vgg16的16是什么意思 如何使用VGG16提取某层的特征?

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

2023-07-17 18:49| 来源: 网络整理| 查看: 265

 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 layern-by-m matrix | m-by-n matrix | h-by-w-by-c-by-n array

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

trainedFeatures'OutputAs' valuen-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等;根据实际需求来!

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3