Bootstrap

MATLAB深度学习(三)——LeNet卷积神经网络

3.1 什么是LeNet卷积神经网络

        接下来我们对上图的网络进行分析:

1. C1:卷积层

· 输入图片大小: 32 * 32

· 输入图片通道个数:1

· 卷积核大小:   5*5

· 卷积核个数: 6

· 卷积步长为1,卷积的步长为valid

· 输出特征图个数:6 (与卷积核个数相同)

· 输出特征图的大小:28*28     (32 - 4,比划比划就知道了)

· 本层训练的参数:156个,每个卷积核要参数为5 * 5个,加上一个公共偏置参数,所以一共为26个,一共有6个卷积核

2. S2: 池化层:

· 输入特征图 : 28*28

· 输入特征图通道个数:6

· 池化:平均池化,2*2的大小

· 输出特征图:6个

· 输出特征图大小:14*14 (28 * 28,2*2算一个池化,那就是缩小一半)


3. C3: 卷积层

· 输入特征图 : 14*14

· 输入特征图通道个数:6

· 卷积核大小:   5*5

· 卷积核个数: 16 (每个卷积核的参数都不一样)

· 卷积步长为1,卷积的步长为valid

· 输出特征图个数:16 (与卷积核个数相同)

· 输出特征图的大小:10*10     (14 - 4,比划比划就知道了)

· 本层训练的参数:1516个

在这里说明,S2产生的6个特征图与C3层的17个卷积核连接关系为部分连接,不是全连接,具体可以网上搜搜看,这种连接方式可以控制连接数量在一个合理的范围内。

4. S4:池化层

· 输入特征图 : 10*10

· 池化:平均池化,2*2的大小

· 输出特征图:16个

· 输出特征图大小:5*5

5. C5:卷积层

· 输入特征图 :5*5

· 输入特征图通道个数:16

· 卷积核大小:   5*5

· 卷积核个数: 120 (每个卷积核中有16个子卷积核)

· 卷积步长为1,卷积的步长为valid

· 输出特征图个数:120 (与卷积核个数相同)

· 输出特征图的大小:1*1     

· 本层训练的参数:48120个

由于输入特征图通道有16个,故每个卷积核中有16个子卷积核,每个子卷积核有5*5的大小,每个卷积核都有5*5*16+1,卷积核个数一共有120个

6. F6:全连接层

· 输入:120维度

· 节点数:Sigmoid函数

7. 07 输出层

        也是全连接层,10个节点,代表数字0 - 9。采用RBF的网络连接方式。

3.2 基于改进LeNet的交通灯识别

        具体改进的内容,在此处就不单列出来了,接下来我用工具箱进行构建

3.2.1 加载交通灯数据样本

imds = imageDatastore('Traffic Light Samples', ...
'IncludeSubfolders',true, ...
'LabelSource','foldernames');

   3.2.2 将数据分为测试集与训练集

%% 步骤2:将样本划分为训练集与测试集,并随机显示训练集中的图像
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7);

% 统计训练集中分类标签的数量
numClasses = numel(categories(imdsTrain.Labels));

% 随机显示训练集中的部分图像
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

3.2.3 构建改进LeNet网络模型

3.2.4 将训练集与验证集图像大小调整为所设计的网络输入层大小相同


%% 步骤4:将训练集中图像的大小与验证集中图像的大小调整成与所设计的网络输入层的大小相同
inputSize = [60 20 3];
% 将训练图像的大小调整为与输入层的大小相同
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
% 将验证图像的大小调整为与输入层的大小相同

3.2.5 设置训练选项,并对网络进行训练

3.2.6 将训练好的网络用于新的输入图像进行分类,并验证其效果

%% 将训练好的网络用于对新的输入图像进行分类,并计算准确率
   YPred = classify(LeNet,augimdsValidation);
   YValidation = imdsValidation.Labels;
   accuracy = sum(YPred == YValidation)/numel(YValidation);
   
%% 随机显示验证效果
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

验证效果:

;