文献阅读LeNet-5

摘要

本周主要深入研究了LeNet-5这一经典的卷积神经网络,通过阅读相关论文和研究工作,我对LeNet-5的结构和创新有了更深刻的理解。LeNet-5是深度学习领域的一个重要里程碑,因为它是早期用于图像分类任务的关键模型之一,它激发了对神经网络在计算机视觉领域的广泛研究,也启发了后续深度学习架构的发展。LeNet-5的卷积和池化层的引入以及权值共享的概念对于今天的深度学习模型仍然具有重要意义。通过不断改进和迭代,深度学习已经成为解决各种复杂问题的强大工具,如图像识别、自然语言处理、语音识别等。LeNet-5的结构包括多个卷积层、池化层和全连接层,它在数字图像识别任务中取得了显著的成功。LeNet-5的设计灵感来自于神经生物学中的视觉处理机制,它通过卷积和池化操作来有效地提取图像中的特征。本文将深入探讨LeNet-5的结构和工作原理,并讨论其在深度学习发展中的重要性。最后进行了pytorch代码实践。

Abstract

This week, I delved deeply into LeNet-5, a classic convolutional neural network, through reading related papers and research works. I have gained a deeper understanding of the structure and innovations of LeNet-5. LeNet-5 is a significant milestone in the field of deep learning, as it was one of the early key models used for image classification tasks. It sparked widespread research into neural networks in the field of computer vision and inspired the development of subsequent deep learning architectures. The introduction of convolutional and pooling layers in LeNet-5, along with the concept of weight sharing, remains significant for today’s deep learning models. Through continuous improvement and iteration, deep learning has become a powerful tool for solving various complex problems, such as image recognition, natural language processing, speech recognition, and more. The structure of LeNet-5, including multiple convolutional layers, pooling layers, and fully connected layers, has achieved remarkable success in digital image recognition tasks. The design of LeNet-5 was inspired by the mechanisms of visual processing in neurobiology, efficiently extracting features from images through convolution and pooling operations. This paper will explore in depth the structure and working principles of LeNet-5 and discuss its significance in the development of deep learning. Finally, practical implementation using PyTorch code is presented.

1、研究背景和目的

20世纪80年代和90年代,神经网络曾经兴盛一时,但后来由于计算能力不足和训练技术的限制而逐渐式微。然而,在2000年后,随着计算能力的显著提高和更好的训练方法的出现,深度学习再次成为研究的焦点。在计算机视觉领域,图像分类一直是一个重要的问题。传统的计算机视觉方法通常需要手工设计特征,这在处理复杂数据集时存在限制。Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton提出了AlexNet,这是一个深度卷积神经网络架构,具有多个卷积层和池化层。AlexNet在ILSVRC 2012竞赛中以巨大的优势赢得了冠军,将图像分类错误率降低到了历史上的最低水平,标志着深度学习在计算机视觉领域的复兴。研究的主要目的是展示深度卷积神经网络在大规模图像分类任务上的有效性。通过使用大型数据集(如ImageNet)和深度CNN,作者希望提高图像分类的准确性,并超越之前的最先进方法。此外,还引入了新的正则化技术(如dropout)来防止过拟合,并展示了GPU在加速深度网络训练中的重要性。

2.研究内容

2.1 主要内容

LeNet-5是一个深度卷积神经网络,最初用于手写数字识别任务。它包括多个卷积层、池化层和全连接层。LeNet-5通过卷积操作提取输入图像的特征,然后通过池化操作减少特征图的大小,最后通过全连接层进行分类。LeNet-5的设计受到了神经生物学中视觉处理的启发,模拟了视觉皮层中的特征提取机制。

2.2 LeNet-5模型结构

LeNet-5的模型结构包括以下关键组件:

  • 卷积层(Convolutional Layer):LeNet-5包含多个卷积层,用于从输入图像中提取特征。这些卷积层采用卷积操作,通过卷积核滑动在输入图像上,从而生成特征图。

    卷积的本质就是输入图片与卷积核做点积(数量积)。

    举一个例子,假设我们有一副5 × 5的输入图片、3 × 3的卷积核分别如下:

    # 图片        #卷积核
    1 1 1 0 0     1 0 1
    0 1 1 1 0     0 1 0
    0 0 1 1 1     1 0 1
    0 0 1 1 0
    0 1 1 0 0
    

    那么卷积的过程就如下面的动画所示:卷积核顺序扫描输入图片,并作点积。

    img

    例如,左上角"4"的计算过程为:

    1*1 + 1*0 + 1*1 + 0*0 + 1*1 + 1*0 + 0*1 + 0*0 + 1*1 = 4
    
  • 池化层(Pooling Layer):池化层用于减少特征图的大小,同时保留重要的特征。LeNet-5使用平均池化和最大池化来减小特征图的维度。

  • 全连接层(Fully Connected Layer):全连接层将池化层的输出连接到一个或多个神经元,用于进行最终的分类。

    image-20231111195346803

LeNet-5一共包含7层(输入层不作为网络结构),分别由2个卷积层、2个池化层和3个连接层组成,接下来,分别详解各层参数:

(1)卷积层C1

手写数字数据集是灰度图像,输入为32 × 32 × 1的图像,卷积核大小为5 × 5,卷积核数量为6,步长为1,零填充。最终得到的C1的feature maps大小为(32-5+1=28)。可训练参数:(5 × 5+ 1)× 6,其中有6个滤波器,每个滤波器5 × 5个units参数和一个bias参数,总共需要学习156个参数,这些参数是权值共享的。

img

(2)下采样层S1

卷积层C1 之后接着就是池化运算,池化核大小为2 × 2,LeNet-5池化运算的采样方式为4个输入相加,乘以一个可训练参数,再加上一个可训练偏置,结果通过sigmoid,所以下采样的参数个数是( 1 + 1 ) × 6 而不是零。

(3)卷积层C3

在LeNet-5中,C3中的可训练参数并未直接连接S2中所有的特征图(Feature Map),而是采用如图2所示的采样特征方式进行连接(稀疏连接)。具体地,C3的前6个feature map(对应图2第一个红框的前6列)与S2层相连的3个feature map相连接(图2第一个红框),后面6个feature map与S2层相连的4个feature map相连接(图2第二个红框),后面3个feature map与S2层部分不相连的4个feature map相连接,最后一个与S2层的所有feature map相连。卷积核大小依然为5 × 5 ,所以总共有6×(3×5×5+1) +6×(4×5×5+1)+3 ×(4×5×5+1)+1×(6×5×5+1)=1516个参数。在原论文中解释了使用这种采样方式原因包含两点:限制了连接数不至于过大(当年的计算能力比较弱);强制限定不同特征图的组合可以使映射得到的特征图学习到不同的特征模式。

(4)下采样层S4

与下采样层S2类似,采用大小为2 × 2,步距为2的池化核对输入feature maps下采样,输出feature maps大小为5 × 5。

(5)卷积层C5

与卷积层C3不同,卷积层C5的输入为S4的全部feature maps,由于S4层的16个图的大小为5 × 5 ,与卷积核的大小相同,所以卷积后形成的图的大小为1x1。

(6)全连接层F6和Output

F6和Output层在图1中显示为全连接层,本质上是一张7×12的比特图,表示经过我们多层处理最终得到的一张"数字图像"。OUTPUT层共有10个结点y0、y1、…、y9,分别对应着数字0到9。采用径向基函数(RBF)的连接方式,计算方式为:

y i = ∑ j = 0 83 ( x j − w i j ) 2 y_i=∑_{j=0}^{83}(x_j−w_{ij})^2 yi=j=083(xjwij)2

其中, w i j w_{ij} wij 。的值由数字i的比特图编码(即上一节展示的ASCII码比特图编码)确定。如果结点yi的计算结果最小,则数字识别的结果为数字i。本质上是比较"我们处理得到的数字比特图"与"真实比特图"之间的相似度。

3、LeNet-5网络结构的主要贡献

3.1 卷积神经网络的先驱

LeNet-5,于1998年由Yann LeCun等人开发,被认为是卷积神经网络(CNNs)的先驱之一。它的出现标志着神经网络在计算机视觉领域的重大突破,为后来深度学习和CNN的研究铺平了道路。LeNet-5首次引入了卷积层和池化层的组合,用于图像特征提取。这个创新的关键点是卷积层用于检测图像的局部特征,而池化层则用于降低特征图的维度,减少计算复杂度。这种组合方式允许模型自动学习图像中的特征,而无需手动设计特征提取器。LeNet-5的另一个重要贡献是层次化的特征提取。通过多层卷积和池化层的组合,模型可以逐渐构建更高级别的特征表示。从检测边缘和纹理到识别更复杂的图案和结构,这种层次化特征提取有助于提高模型的分类性能。

3.2 基于梯度的优化算法

LeNet-5引入了基于梯度的优化算法,如梯度下降,以自动调整网络权重,使其能够适应训练数据。这一创新大大提高了训练效率和模型的收敛速度,使神经网络更容易训练和优化。LeNet-5中使用的基于梯度的优化算法主要包括以下步骤:

  1. 前向传播: 对于给定的输入图像,LeNet-5通过前向传播计算每一层的输出。这包括卷积层、池化层以及全连接层的计算。

  2. 计算损失函数: 在前向传播后,通过将网络的输出与真实标签进行比较,计算出损失函数的值。通常,LeNet-5使用交叉熵损失函数来度量模型的预测与实际标签之间的差异。

  3. 反向传播: 反向传播是梯度下降的关键步骤。它从输出层开始,计算损失函数关于每个参数的梯度。这是通过使用链式规则来逐层传播误差信号的过程。

  4. 参数更新: 一旦计算出梯度,就可以使用梯度下降算法来更新网络的参数。这包括权重和偏差的更新,通常按照以下方式进行更新:

    新权重 = 旧权重 - 学习率 * 梯度

    其中,学习率是一个超参数,控制着参数更新的步长。通过多次迭代前向传播、损失计算、反向传播和参数更新的过程,LeNet-5的权重和偏差逐渐调整,使损失函数最小化。

3.3 手写数字识别的成功应用

LeNet-5首次成功应用于手写数字识别任务,特别是美国邮政服务的邮政编码识别。这一应用展示了卷积神经网络在实际问题中的潜力,引领了深度学习在计算机视觉领域的发展。LeNet-5的成功应用启发了研究人员进一步探索CNN的潜力,并在各种图像识别和分析任务中取得了重大突破。

3.4 相关算法的推导

00RE~HVWR4@@I85{ZH87YS8

image-20231112213008792

4.代码实现:

首先,需要定义一下Reshape类,将图像转为(X,1,28,28)的形式,其中X为图像的数量,1* 28* 28为图像格式,1为通道数。

#将x转为1*28*28的数据
class Reshape(torch.nn.Module):
    def forward(self,x):
        return x.view(-1,1,28,28)

然后,定义LeNet-5网络结构:

#LeNet-5网络结构
net=nn.Sequential(
    Reshape(),nn.Conv2d(1,6,kernel_size=5,padding=2),nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2,stride=2),
    nn.Conv2d(6,16,kernel_size=5),nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2,stride=2),nn.Flatten(),
    nn.Linear(16*5*5,120),nn.Sigmoid(),
    nn.Linear(120,84),nn.Sigmoid(),
    nn.Linear(84,10))
检查模型

可以初始化一个1* 1* 28* 28的torch张量对模型进行检查,查看其相应层的输出,代码如下:

#检查模型
x=torch.rand(size=(1,1,28,28),dtype=torch.float32)
for layer in net:
    x=layer(x)
    print(layer.__class__.__name__,'output shape:\t',x.shape)
构建加载数据集函数

定义加载数据集函数:

#定义加载数据集函数
def load_data_fashion_mnist(batch_size):
    '''下载MNIST数据集然后加载到内存中'''
    train_dataset=datasets.MNIST(root='../data',train=True,transform=transforms.ToTensor(),download=True)
    test_dataset=datasets.MNIST(root='../data',train=False,transform=transforms.ToTensor(),download=True)
    return (data.DataLoader(train_dataset,batch_size,shuffle=True),
           data.DataLoader(test_dataset,batch_size,shuffle=False))

然后,调用该函数,设置batch_size为64:

#LeNet-5在MNIST数据集上的表现
batch_size=64
train_iter,test_iter=load_data_fashion_mnist(batch_size=batch_size)
数据集可视化

torchvision.utils的make_grid()函数将数据集可视化,首先需要定义imshow()函数显示图像:

def imshow(img):
     img = img / 2 + 0.5 # unnormalize
     npimg = img.numpy()
     plt.imshow(np.transpose(npimg, (1, 2, 0)))
     plt.show()
开始训练

设置损失函数、优化器及开始训练代码如下:

#损失函数
loss_function=nn.CrossEntropyLoss()
#优化器
optimizer=torch.optim.Adam(net.parameters())
#开始训练
num_epochs=10
train_loss = []
for epoch in range(num_epochs):
    for batch_idx, (x, y) in enumerate(train_iter):
#         x = x.view(x.size(0), 28 * 28)
        out = net(x)
        y_onehot =F.one_hot(y,num_classes=10).float()    # 转为one-hot编码
        
        loss = loss_function(out, y_onehot)  # 均方差
        # 清零梯度
        optimizer.zero_grad()
        loss.backward()
        # w' = w -lr * grad
        optimizer.step()
        train_loss.append(loss.item())
        if batch_idx % 10 == 0:
            print(epoch, batch_idx, loss.item())

本次训练十次,训练完成后,绘制损失曲线:

#绘制损失曲线
plt.figure(figsize=(16,8))
plt.grid(True,linestyle='--',alpha=0.5)
plt.plot(train_loss,label='loss')
plt.legend(loc="best")

image-20231112094847485

5.总结

在本周的学习,我不仅对LeNet-5的基本结构和在计算机视觉领域的重要性有了深入理解,而且掌握了其核心技术和实现方法。LeNet-5作为深度学习和计算机视觉的先驱,其创新的网络设计和有效的图像处理能力对后续的深度学习模型产生了深远影响。通过PyTorch的实践操作,更加深入地理解了LeNet-5的实际应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值