卷积神经网络的结构_【卷积神经网络结构专题】一文详解LeNet(附代码实现)...

关注上方深度学习技术前沿,选择“星标公众号”

资源干货,第一时间送达!c68cb60292cf3f7837b901be011ffc62.png

c0210c9816ccdf42c3f798d9de7a4688.png

0a4654277bc7dadace84d658de8b7c4d.gif 近期,公众号将推出卷积神经网络结构系列专题文章,将深入浅出的为大家介绍从1998年到2020年的卷积神经网络结构,深刻体会每种网络的前世今身和进化历程。本文作为开篇,我们一起来探索一下由CNN之父Yann LeCun在1998提出来的第一个神经网络结构——LeNet。

439d295d419beb9aefe5839d944eba46.png

abfb397b5892b3ab42acbd857a9f01b7.png

1. Introduction

LeNet通过巧妙的设计,利用卷积、参数共享、下采样等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是近20年来大量神经网络架构的起源。

2. 网络结构

LeNet-5是1998年YannLeCun设计用于手写数字识别的模型,LeNet-5也是LeNet系列最新的卷积神经网络,网络结构如下图所示:

340f8f58ff3c9980f798d8f6ff2c67b2.png

网络基本架构为:Input -> conv1 (6) -> pool1 -> conv2 (16) -> pool2 -> fc3 (120) -> fc4 (84) -> fc5 (10) -> softmax。括号中的数字代表通道数,网络名称中有5表示它有5层conv/fc层。其中每一个卷积层中的卷积核大小均为5x5,stride=1,无填充,LeNet-5中使用的激活函数为tanh。LeNet-5之后被成功用于ATM以对支票中的手写数字进行识别。LeNet取名源自其作者姓LeCun。

63186a85737a7d7a1b93dfe988941123.png 网络架构具体介绍如下:
  • 首先输入图像是单通道32 x 32大小的图像,在pytorch中维度表示就是[B,1,32,32]其中代表batch_size
  • 卷积层conv1:

  • 卷积核尺寸为5x5,滑动步长为1,卷积核数目为6,那么经过这一层后图像的尺寸变成(32 - 5)/1 + 1 = 28,输出特征图的维度即为[B,6,28,28]

  • 参数个数为(5x5+1)x6=156 (其中5x5对应kernel size,+1为bias,6为feature map 数目)

  • 连接数为156x28x28=122304(156为参数个数,其中feature map上每个像素点对应156个连接)

  • 池化层pool1:

  • 池化核尺寸为2x2,步长为2,这是没有重叠的max pooling,进行池化操作之后,图像尺寸减半,变为14x14,输出特征图维数为:[B,6,14,14]

  • 参数个数为 6x(1+1)=12。(因为LeNet-5采用的sigmoid(a*average(x)+b)作为池化函数)

  • 链接个数为6x14x14x(2x2+1)=5880。六个feature map,总共6x14x14个feature,每个feature由4个C2特征+1个bias

  • 卷积层conv2:
  • 卷积核尺寸为5x5,滑动步长为1,卷积核数目为16,那么经过这一层后图像的尺寸变成(14 - 5)/1 + 1 = 10,输出特征图的维度即为[B,16,10,10]

  • 参数个数为(5x5x3+1)x6+(5x5x4+1)x9+(5x5x6+1)=1516个。括号内部为kernel_size x kernel_size x feature_map_num + bias_num,表示从feature_map_size卷积得到的feature map所需要的参数个数;括号外为相应得到feature map的数目。

  • 链接个数为1516x10x10=151600个。其中1516为参数个数,10为新生成的feature map的size。

  • 池化层pool2:

  • 池化核尺寸为2x2,步长为2,这是没有重叠的max pooling,进行池化操作之后,图像尺寸减半,变为5x5,输出特征图维数为:[B,16,5,5]

  • 参数个数为16x(1+1)=32。(因为LeNet-5采用的sigmoid(a*average(x)+b)作为池化函数)

  • 链接个数为5x5x16x(2x2+1)=2000。(5为新生成feature map的size,16为feature map的数目,2为kernel size,1为bias。

  • 卷积层conv3:

  • 卷积核尺寸为5x5,滑动步长为1,卷积核数目为120,那么经过这一层后图像的尺寸变成(5- 5)/1 + 1 = 1,输出特征图的维度即为[B,120,1,1]

  • 参数个数为120x(5x5x16+1)=48120。

  • 链接个数等于参数个数,因为新生成feature map的size为1。

  • 全连接层fc1:

  • 输入120个,输出84个(文章中是把图片对应的字符在7x12的bitmap上画出,白值为-1,黑值为1,其中84个像素平铺之后的向量对应为相应字符的表述,作为真值与F6连接)

  • 链接个数=参数个数=(120+1)x84,其中+1为bias

  • 全连接层fc2:
  • 输出神经元个数为10,最后得到一个10维的特征向量,用于10个数字的分类训练,再送入softmaxt分类,得到分类结果的概率output。

PyTorch代码实现如下
class LeNet5(nn.Module):

    def __init__(self, num_classes, grayscale=False):
        super(LeNet5, self).__init__()
        
        self.grayscale = grayscale
        self.num_classes = num_classes

        if self.grayscale:
            in_channels = 1
        else:
            in_channels = 3

        self.features = nn.Sequential(
            
            nn.Conv2d(in_channels, 6, kernel_size=5),
            nn.Tanh(),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(6, 16, kernel_size=5),
            nn.Tanh(),
            nn.MaxPool2d(kernel_size=2)
        )

        self.classifier = nn.Sequential(
            nn.Linear(16*5*5, 120),
            nn.Tanh(),
            nn.Linear(120, 84),
            nn.Tanh(),
            nn.Linear(84, num_classes),
        )


    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, 1)
        logits = self.classifier(x)
        probas = F.softmax(logits, dim=1)
        return logits, probas

推荐阅读

(点击标题可跳转阅读)

  • 干货|最全面的卷积神经网络入门教程
  • 【最新综述】轻量级神经网络架构综述
  • 论文大盘点|卷积神经网络必读的100篇经典论文,包含检测/识别/分类/分割多个领域
  • 【汇总】一大波CVPR2020开源项目重磅来袭!
3ee358e828ee5502f262fe4f46abb1eb.png

欢迎添加群助手微信,进计算机视觉微信交流群探讨CV相关内容!

4c61efa1e15834f2de15bf2e6ef843ba.png

长按识别添加,邀请您进群!

原创不易,在看鼓励!比心哟!b65a4c2bebee82e1ab517715cc22ecfb.png

f7d44556df005da5f25f8c2426ed492b.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值