此示例说明如何使用迁移学习对预训练的卷积神经网络 AlexNet 进行重新训练,以对新图像集进行分类。尝试此示例,了解如何在 MATLAB® 中轻松开始深度学习。
深度学习应用中常常用到迁移学习。您可以采用预训练的网络,基于它学习新任务。与使用随机初始化的权重从头训练网络相比,通过迁移学习微调网络要更快更简单。您可以使用较少数量的训练图像快速地将已学习的特征迁移到新任务。
本示例用到了AlexNet,如果没有下载会报错,并提示下载链接,,在报错的红字中有安装的路径(Add-On-Explorer),只需要点击进去登陆便可以下载此模块。
clear
clc
close all
unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
net = alexnet;
layersTransfer = net.Layers(1:end-3);
numClasses = numel(categories(imdsTrain.Labels));
layers = [
layersTransfer
fullyConnectedLayer(numClasses,'WeightLearnRateFactor',10,'BiasLearnRateFactor',10)
softmaxLayer
classificationLayer];
options = trainingOptions('sgdm', ...
'MiniBatchSize',10, ...
'MaxEpochs',6, ...
'InitialLearnRate',1e-4, ...
'ValidationData',imdsValidation, ...
'ValidationFrequency',3, ...
'Verbose',false, ...
'Plots','training-progress');
netTransfer = trainNetwork(imdsTrain,layers,options);
YPred = classify(netTransfer,imdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
训练过后的结果:
clear
clc
close all
%% 加载数据
% 解压缩示例图像并加载这些图像作为图像数据存储。
% imageDatastore 根据文件夹名称自动标记图像,并将数据存储为 ImageDatastore 对象。
% 通过图像数据存储可以存储大图像数据,包括无法放入内存的数据。将数据拆分,其中 70% 用作训练数据,30% 用作测试数据。
unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
'IncludeSubfolders',true, ...
'LabelSource','foldernames');
[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');
%% 在这个非常小的数据集中,现在有 55 个训练图像和 20 个验证图像。显示一些示例图像。
numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
subplot(4,4,i)
I = readimage(imdsTrain,idx(i));
imshow(I)
end
%% 加载预训练网络
net = alexnet;
%% 显示网络架构。该网络有五个卷积层和三个全连接层。
net.Layers
%% 第一层(图像输入层)需要大小为 227×227×3 的输入图像,其中 3 是颜色通道数。
inputSize = net.Layers(1).InputSize
%% 提取图像特征
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);
layer = 'fc7';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');
%% 从训练数据和测试数据中提取类标签。
YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;
%% 拟合图像分类器
% 使用从训练图像中提取的特征作为预测变量,并使用 fitcecoc (Statistics and Machine Learning Toolbox) 拟合多类支持向量机 (SVM)。
classifier = fitcecoc(featuresTrain,YTrain);
%% 对测试图像进行分类
% 使用经过训练的 SVM 模型和从测试图像中提取的特征对测试图像进行分类。
YPred = predict(classifier,featuresTest);
% 显示四个示例测试图像及预测的标签。
idx = [1 5 10 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
% 计算针对测试集的分类准确度。准确度是网络预测正确的标签的比例。
accuracy = mean(YPred == YTest)
上例是一个小数据集的迁移学习,其数据集内容为:
测试用例的标签为: