文章目录
- 前言
- 一、LeNet5原理
- 1.1LeNet5网络结构
- 1.2LeNet网络参数
- 1.3LeNet5网络总结
- 二、AlexNext
- 2.1AlexNet网络结构
- 2.2AlexNet网络参数
- 2.3Dropout操作
- 2.4PCA图像增强
- 2.5LRN正则化
- 2.6AlexNet总结
- 三、实战
- 3.1LeNet5模型搭建
- 3.2模型训练
前言
参考原视频:哔哩哔哩。
一、LeNet5原理
1.1LeNet5网络结构
LeNet-5,其中, 5 5 5表示神经网络中带有参数的网络层数量为 5 5 5,如卷积层带有参数 ( w , b ) (w,b) (w,b),而池化层仅仅是一种操作,并不带有参数,而在LeNet-5中共含有两层卷积层、三层全连接层(有一层未标出)。
- 卷积层和池化层:用于提取特征。
- 全连接层:一般位于整个卷积神经网络的最后,负责将卷积输出的二维特征图转化成一维的一个向量(将特征空间映射到标记空间),由此实现了端到端的学习过程(即:输入一张图像或一段语音,输出一个向量或信息)。全连接层的每一个结点都与上一层的所有结点相连因而称之为全连接层。由于其全相连的特性,一般全连接层的参数也是最多的。
事实上,不同的卷积核提取的特征并不相同,比如猫、狗、鸟都有眼睛,而如果只用局部特征的话不足以确定具体类别,此时就需要使用全连接层组合这些特征来最终确定是哪一个分类,即起到组合特征和分类器功能。
1.2LeNet网络参数
- 输入层:输入大小为(28,28)、通道数为1的灰度图像。
- 卷积层:卷积核尺寸为(6,5,5),即六个5x5大小的卷积核,填充为2,故输出特征图尺寸为(6,28,28)。
- 池化层:使用平均池化,步幅为2,故输出特征图尺寸为(6,14,14)。
- 卷积层:卷积核尺寸为(16,6,5,5),即16个6x5x5大小的卷积核,故输出特征图为(16,10,10).
- 池化层:使用平均池化,步幅为2,输出特征图为(16,5,5)。
- 全连接层:将所有特征图均展平为一维向量并进行拼接(通过调用
nn.Flatten
完成,输出为二维矩阵,每一行向量都是一张图片的展平形式),对应120个神经元。 - 全连接层:将上一全连接层120个神经元映射为84个神经元。
- 全连接层:将上一全连接层84个神经元映射为10个神经元。
可知,卷积层往往会使通道数变大,而池化层往往会使特征图尺寸变小。
1.3LeNet5网络总结
二、AlexNext
2.1AlexNet网络结构
AlexNet与LeNet设计理念相似,但有如下差异:
- AlexNet比LeNet要深很多。
- AlexNet由八层组成,包括五个卷积层,两个全连接隐藏层和一个全连接输出层。
- AlexNet使用ReLUctant而非sigmoid作为激活函数。
2.2AlexNet网络参数
注意:
- 图中的数据格式为(H,W,C,N),且最后全连接层的10是因为之后的案例输出为10个分类。
- 网络参数过多时容易出现过拟合的情况(全连接层存在大量参数 w 、 b w、b w、b),使用Dropout随机失活神经元。
2.3Dropout操作
Dropout用于缓解卷积神经网络CNN过拟合而被提出的一种正则化方法,它确实能够有效缓解过拟合现象的发生,但是Dropout带来的缺点就是可能会减缓模型收敛的速度,因为每次迭代只有一部分参数更新,可能导致梯度下降变慢。
其中,神经元的失活仅作用于一轮训练,在下一轮训练时又会随机选择神经元失活。每一轮都会有随机的神经元失活,以此降低缓解过拟合并提高模型训练速度。
2.4PCA图像增强
图像增强是采用一系列技术去改善图像的视觉效果,或将图像转换成一种更适合于人或机器进行分析和处理的形式。例如采用一系列技术有选择地突出某些感兴趣的信息,同时抑制一些不需要的信息,提高图像的使用价值。
2.5LRN正则化
2.6AlexNet总结
三、实战
3.1LeNet5模型搭建
import torch
from torch import nn
from torchsummary import summarydevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()# 手写数字图片大小为32*32,故需填充2个像素self.model = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2),nn.Sigmoid(),nn.AvgPool2d(kernel_size=2, stride=2),nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5),nn.AvgPool2d(kernel_size=2, stride=2),nn.Flatten(),nn.Linear(in_features=16 * 5 * 5, out_features=120),nn.Linear(in_features=120, out_features=84),nn.Linear(in_features=84, out_features=10),)def forward(self, x):return self.model(x)myLeNet = LeNet().to(device)
print(summary(myLeNet,input_size=(1, 28, 28)))
注意,此处在卷积层后使用了sigmoid激活函数,事实上,卷积操作本质仍是一种线性操作,而若只有线性变换,那无论多少层神经元,都能简化层一层神经元,那神经网络只是简单多元线性回归而已,不能拟合更加复杂的函数。此时使用激活函数就可将神经网络非线性化,即提升神经网络的拟合能力,能拟合更复杂的函数。