AlexNet于2012年出现在ImageNet的图像分类比赛中,并取得了当年冠军,从此卷积神经网络开始受到人们的强烈关注。AlexNet是深度卷积神经网络研究热潮的开端,也是研究热点从传统视觉方法过度到卷积神经网络网络的标志。
AlexNet模型共包含有8层,包含5个卷积层和3个全连接层,AlexNet相比于LeNet的特点在于,对于每一个卷积层,均包含RELU和局部响应归一化处理。
须设置数据集文件夹与神经网络的m文件地址相同,数据集文件夹命名为为TrafficLightSamples,其包含的子文件夹如下,每一类共有500张图片:
部分图片如下:
搭建网络的部分函数不在赘述,可以查看上一篇文章(LeNet)。
代码实现与详解:
1.加载图片样本:
% 功能:对AlexNet用样本数据进行训练,实现对输入图像的识别
clear
close all
clc
% 加载图像数据
imds = imageDatastore('TrafficLightSamples', ...
'IncludeSubfolders',true, ...
'LabelSource','foldernames');
'IncludeSubfolders',true:包含每个文件夹中的所有文件和子文件夹;
'LabelSource','foldernames':根据文件夹名称分配标签并储存在Labels属性中。
2.将样本划分为训练集和测试集,并统计分类数量:
% 划分验证集和训练集
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
% 确定训练数据中需要分类的种类
numClasses = numel(categories(imdsTrain.Labels));
imdsTrain为训练样本数据,imdsValidation为验证样本数据,0.7为训练样本的比例。
3.构建AlexNet并进行可视化分析:
% AlexNet网络
alexnet = [
imageInputLayer([60,20,3])
convolution2dLayer([11,11],48,'Padding','same','Stride',4)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(3,'Padding','same','Stride',2)
convolution2dLayer([5,5],128,'Padding',2,'Stride',1)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(3,'Padding','same','Stride',2)
convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
batchNormalizationLayer
reluLayer
convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
batchNormalizationLayer
reluLayer
convolution2dLayer([3 3],128,'Stride',1,'Padding',1)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(3,'Padding','same','Stride',2)
fullyConnectedLayer(4096)
reluLayer
dropoutLayer(0.5)
fullyConnectedLayer(numClasses) % 将新的全连接层的输出设置为训练数据中的种类
softmaxLayer % 添加新的Softmax层
classificationLayer ]; % 添加新的分类层
% 对构建的网络进行可视化分析
lgraph = layerGraph(alexnet);
analyzeNetwork(lgraph)
batchNormalizationLayer:局部响应归一化;
reluLayer:RELU函数激活;
dropoutLayer(0.5):节点丢弃,使每个神经元有50%的概率被去除,以防止过拟合;
analyzeNetwork:对网络可视化分析,其运行结果如下:
4.调整训练集和输入级的图像大小使其与AlexNet输入层相同:
%% 调整数据集
% 网络输入层的大小和通道数
inputSize = [60,20,3];
% 将批量训练图像的大小调整为与输入层的大小相同
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
% 将批量验证图像的大小调整为与输入层的大小相同
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
5.配置训练选项并对网络训练:
%% 对网络进行训练
% 对训练参数进行设置
options = trainingOptions('sgdm', ...
'MiniBatchSize',15, ...
'MaxEpochs',3, ...
'InitialLearnRate',0.0003, ...
'Shuffle','every-epoch', ...
'ValidationData',augimdsValidation, ...
'ValidationFrequency',3, ...
'Verbose',true, ...
'Plots','training-progress');
% 用训练图像对网络进行训练
net = trainNetwork(augimdsTrain,alexnet,options);
训练选项如下:
'sgdm':训练方法为sgdm;
'MiniBatchSize',15:小批量样本数为15;
'MaxEpochs',3:最大轮数为3;
'InitialLearnRate',0.0003:初始学习率为0.0003;
'Shuffle','every-epoch': 在每一轮训练前打乱数据;
'ValidationData',augimdsValidation:训练期间所用数据为augimdsValidation;
'ValidationFrequency',3:验证频率为3次/轮;
'Verbose',true:设置打开命令窗口输出;
'Plots','training-progress':设置打开训练进度图,该代码运行结果如下:
最终验证准确度达到了极高的99.22%。
6.将训练好的图像用于对新的输入图像进行分类,并计算准确率:
%% 验证并显示结果
% 对训练好的网络采用验证数据集进行验证
[YPred,scores] = classify(net,augimdsValidation);
%% 计算分类准确率
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
%% 创建并显示混淆矩阵
figure
confusionchart(YValidation,YPred)
confusionchart可以产生混淆矩阵,以便我们更直观的看出AlexNet验证的结果,该代码运行结果如下:
训练准确度达到了极高的99.22%,说明该网络取得了极好的训练效果,对输入图像做到了准确分类。
完整代码如下:
% 功能:对AlexNet用样本数据进行训练,实现对输入图像的识别
clear
close all
clc
% 加载图像数据
imds = imageDatastore('TrafficLightSamples', ...
'IncludeSubfolders',true, ...
'LabelSource','foldernames');
% 划分验证集和训练集
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
% 确定训练数据中需要分类的种类
numClasses = numel(categories(imdsTrain.Labels));
% AlexNet网络
alexnet = [
imageInputLayer([60,20,3])
convolution2dLayer([11,11],48,'Padding','same','Stride',4)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(3,'Padding','same','Stride',2)
convolution2dLayer([5,5],128,'Padding',2,'Stride',1)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(3,'Padding','same','Stride',2)
convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
batchNormalizationLayer
reluLayer
convolution2dLayer([3 3],192,'Padding',1,'Stride',1)
batchNormalizationLayer
reluLayer
convolution2dLayer([3 3],128,'Stride',1,'Padding',1)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(3,'Padding','same','Stride',2)
fullyConnectedLayer(4096)
reluLayer
dropoutLayer(0.5)
fullyConnectedLayer(numClasses) % 将新的全连接层的输出设置为训练数据中的种类
softmaxLayer % 添加新的Softmax层
classificationLayer ]; % 添加新的分类层
% 对构建的网络进行可视化分析
lgraph = layerGraph(alexnet);
analyzeNetwork(lgraph)
%% 调整数据集
% 网络输入层的大小和通道数
inputSize = [60,20,3];
% 将批量训练图像的大小调整为与输入层的大小相同
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
% 将批量验证图像的大小调整为与输入层的大小相同
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
%% 对网络进行训练
% 对训练参数进行设置
options = trainingOptions('sgdm', ...
'MiniBatchSize',15, ...
'MaxEpochs',3, ...
'InitialLearnRate',0.0003, ...
'Shuffle','every-epoch', ...
'ValidationData',augimdsValidation, ...
'ValidationFrequency',3, ...
'Verbose',true, ...
'Plots','training-progress');
% 用训练图像对网络进行训练
net = trainNetwork(augimdsTrain,alexnet,options);
%% 验证并显示结果
% 对训练好的网络采用验证数据集进行验证
[YPred,scores] = classify(net,augimdsValidation);
%% 计算分类准确率
YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
%% 创建并显示混淆矩阵
figure
confusionchart(YValidation,YPred)