卷积神经网络程序(迁移学习)构成
实例需求
基于共享参数的迁移学习的原理,对AlexNet进行改进,并用样本数据进行训练,实现对输入图像的识别。
开发步骤
- 加载图像数据,并将其划分为训练集与验证集
- 加载预训练好的网络(AlexNet)
- 对网络结构进行改进
- 调整数据集
- 训练网络
- 进行验证并显示效果
代码(MATLAB)
加载图像数据,并将其划分为训练集与验证集
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中用每一轮的迭代次数来展示。