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

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

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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaichu2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值