【CNN】卷积神经网络(LeNet)是什么?如何实现LeNet?

系列文章目录


第一章 深度学习 CNN中的卷积神经网络(LeNet)


目录

系列文章目录

文章目录

前言

一、卷积神经网络(LeNet)是什么?

二、LeNet的网络结构

三、实现LeNet模型

​​​​

总结


前言

本文主要是介绍卷积神经网络中的一个最基本的模型:卷积神经网络(LeNet),包含对卷积神经网络(LeNet)一个简单的介绍,以及如何实现LeNet?读完这篇文章,你会对卷积神经网络(LeNet)有个基本的了解。


一、卷积神经网络(LeNet)是什么?

卷积神经网络就是含卷积层的网络。LeNet早期是用来识别手写数字图像的 。这个名字来源于LeNet论文的第一作者Yann LeCun,这是一篇1998年发表的论文。LeNet展示了通过梯度下降训练卷积神经网络可以达到手写数字识别在当时最先进的结果。

LeCun, Y., Bottou, L., Bengio, Y., & Haffner, P. (1998). Gradient-based learning applied to document recognition. Proceedings of the IEEE, 86(11), 2278-2324.

二、LeNet的网络结构

话不多说,我们来了解下LeNet的网络结构,如下图所示:

LeNet分为卷积层块和全连接层块两个部分。下面我们分别介绍这两个模块。

卷积层块里的基本单位是卷积层后接最大池化层,卷积层块由两个这样的基本单位重复堆叠构成。在卷积层块中,每个卷积层都使用5×5的窗口,并在输出上使用sigmoid激活函数。

第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。这是因为第二个卷积层比第一个卷积层的输入的高和宽要小,所以增加输出通道使两个卷积层的参数尺寸类似。

卷积层块的两个最大池化层的窗口形状均为2×2,步幅为2。由于池化窗口与步幅形状相同,池化窗口在输入上每次滑动所覆盖的区域互不重叠。

卷积层块的输出形状为(批量大小, 通道, 高, 宽)。当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。也就是说,全连接层的输入形状将变成二维,其中第一维是小批量中的样本,第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。全连接层块含3个全连接层。它们的输出个数分别是120、84和10,其中10为输出的类别个数。

三、实现LeNet模型

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(1, 6, 5), # in_channels, out_channels, kernel_size
            nn.Sigmoid(),
            nn.MaxPool2d(2, 2), # kernel_size, stride
            nn.Conv2d(6, 16, 5),
            nn.Sigmoid(),
            nn.MaxPool2d(2, 2)
        )
        self.fc = nn.Sequential(
            nn.Linear(16*4*4, 120),
            nn.Sigmoid(),
            nn.Linear(120, 84),
            nn.Sigmoid(),
            nn.Linear(84, 10)
        )

    def forward(self, img):
        feature = self.conv(img)
        output = self.fc(feature.view(img.shape[0], -1))
        return output

创建完模型后,我们可以输入下面代码来查看每个层的形状。

net = LeNet()

print(net)

这里我直接给出输出结果:

LeNet(
  (conv): Sequential(
    (0): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
    (1): Sigmoid()
    (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (3): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
    (4): Sigmoid()
    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (fc): Sequential(
    (0): Linear(in_features=256, out_features=120, bias=True)
    (1): Sigmoid()
    (2): Linear(in_features=120, out_features=84, bias=True)
    (3): Sigmoid()
    (4): Linear(in_features=84, out_features=10, bias=True)
  )
)
可以看见与我们之前分析的网络结构一致,主要分为卷积层块和全连接层块两部分。

​​​​


总结

读完这篇文章,我相信你已经对卷积神经网络(LeNet)有了一个基本的了解了,LeNet只是最简单的cnn模型,后面还有很多cnn模型,了解了LeNet后,大家可以继续学习深度卷积神经网络(AlexNet)。

猜你喜欢

转载自blog.csdn.net/m0_51816252/article/details/130657443
今日推荐