基于共享参数的迁移学习的原理,对AlexNet进行改进,并用样本数据进行训练,实现对输入图像的识别。
clc,clear;
unzip('MerchData.zip');
imds= imageDatastore('MerchData', ...
'IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomize');
%将样本按照7:3随机分为训练集与验证集
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
%该部分挑选出16张图片显示用于确定图像数据是否被导入
net=alexnet;%加载训练好的网络
layersTransfer=net.Layers(1:end-3); %保留AlexNet倒数第三层之前的网络
numClasses=numel(categories(imdsTrain.Labels));%确定训练集中需要分类的种类
layers = [
layersTransfer %保留倒数第三层之前的网络
fullyConnectedLayer(numClasses)%将全连接层的输出设置为训练数据中的种类
softmaxLayer %添加新的softmaxlayer
classificationLayer ]; %添加新的分类层
%构建新的网络,保留AlexNet倒数第三层之前的网络,再次在此之后重新添加了全连接层
inputSize = net.Layers(1).InputSize; %查看网络输入层的大小和通道数
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
%将批量训练图像的大小调整为与输入层的大小相同
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
%将批量验证图像的大小设置为与输入层大小相同
options = trainingOptions('sgdm', ...%动量随机梯度下降
'MiniBatchSize',15, ...%小批量样本数为15
'MaxEpochs',10, ...%训练最大轮数
'InitialLearnRate', 0.00005, ... %初始学习率为0.00005
'Shuffle', 'every-epoch', ...%数据打乱选项,此处为每一轮都打乱
'ValidationData', augimdsValidation, ...%指定训练期间所用的验证数据
'ValidationFrequency',3, ...%验证频率
'Verbose',true, ... %在命令窗口显示训练进度
'Plots', 'training-progress');%绘制图像,显示训练过程
netTransfer = trainNetwork(augimdsTrain,layers,options);%用训练集对网络进行训练
[Ypred,scores]= classify(netTransfer,augimdsValidation);%对训练好的网络采用验证集进行验证
idx=randperm(numel(imdsValidation.Files),4);
figure
for i =1:4
subplot(2,2,i)
I = readimage(imdsValidation,idx(i));
imshow(I)
label = Ypred(idx(i));
title(string(label));
end
%随机显示验证效果
YValidation= imdsValidation.Labels; %验证集中的数据数量
accuracy = mean(Ypred==YValidation); %mean用于计算均值
%计算分类准确率
figure
confusionchart(YValidation,Ypred) %显示迁移学习的分类矩阵
%创建并显示混淆矩阵
1.minibatch的理解:假设有10000个可以训练神经网络的样本,如果对每一个样本进行计算并根据误差调整网络的权重,这种方法叫做随机梯度下降法(SGD)用这些数据对深度神经网络训练一轮,需要调整10000次权重,由于样本中存在优质样本,也存在垃圾样本。为了解决垃圾样本带来的不稳定性,科学家尝试过将10000个样本算出的权重更新值取平均,然后调整一次权重,但是这样的话对10000个样本进行计算只调整一次权重导致权重调整太慢。
最后科学家选取了一个折中方法,比如对10000个样本分别进行计算,但把10000个样本分成100组,对每一组中的100个样本的权重更新值取平均,这样就可以进行100次权重调整
2.ValidationFrequency:验证的频率。即每一轮中计算精度。损失函数的次数,在matlab中用每一轮的迭代次数来展示。