Matlab深度学习入门实例:基于AlexNet的红绿灯识别(附完整代码)

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)

猜你喜欢

转载自blog.csdn.net/qq_51942551/article/details/128028245
今日推荐