前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度学习基础:9.复现经典网络:LeNet5与AlexNet

深度学习基础:9.复现经典网络:LeNet5与AlexNet

作者头像
zstar
发布2022-09-08 11:54:22
4160
发布2022-09-08 11:54:22
举报
文章被收录于专栏:往期博文

LeNet5

1998年, LeNet5 被LeCun等人在论文《Gradient-Based Learning Applied to Document Recognition》中正式提出,它被认为是现代卷积神经网络的奠基者。

网络结构图:

代码语言:javascript
复制
import torch
from torch import nn
from torch.nn import functional as F

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 6, 5)  # (H+2p-K)/S + 1
        self.pool1 = nn.AvgPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.pool2 = nn.AvgPool2d(2)
        self.fc1 = nn.Linear(5 * 5 * 16, 120)
        self.fc2 = nn.Linear(120, 84)

    def forward(self, x):
        x = torch.tanh(self.conv1(x))
        x = self.pool1(x)
        x = torch.tanh(self.conv2(x))
        x = self.pool2(x)
        x = x.view(-1, 5 * 5 * 16)  
        x = torch.tanh(self.fc1(x))
        output = F.softmax(self.fc2(x), dim=1)  # (samples, features)

使用模型可视化工具torchinfo可以模拟输入,查看模型信息。

代码语言:javascript
复制
from torchinfo import summary

net = Model()
summary(net, input_size=(10, 1, 32, 32))

输出结果如图:

AlexNet

AlexNet诞生于有“视觉界奥林匹克”之称的大规模视觉识别挑战比赛ILSVRC(ImageNet Large Scale Visual Recognition Challenge)。AlexNet出现之前,最好成绩一直由手工提取特征+支持向量机的算法获得,最低错误率为25.8%。2012年,AlexNet进入ILSVRC竞赛,一下将错误率降低到了15.3%。

相比于LeNet5,AlexNet主要做出了如下改变:

  • 卷积核更小、网络更深、通道数更多
  • 使用了ReLU激活函数
  • 使用了Dropout层来控制模型复杂度,控制过拟合
  • 引入了大量传统或新兴的图像增强技术来扩大数据集,进一步缓解过拟合。
  • 使用GPU对网络进行训练

AlexNet的网络结构如图所示:

代码语言:javascript
复制
class Model(nn.Module):
    def __init__(self):
        super().__init__()

        # 为了处理尺寸较大的原始图片,先使用11x11的卷积核和较大的步长来快速降低特征图的尺寸
        # 同时,使用比较多的通道数,来弥补降低尺寸造成的数据损失
        self.conv1 = nn.Conv2d(3, 96, kernel_size=11, stride=4)
        self.pool1 = nn.MaxPool2d(kernel_size=3, stride=2)  # overlap pooling

        # 已经将特征图尺寸缩小到27x27,计算量可控,可以开始进行特征提取了
        # 卷积核、步长恢复到业界常用的大小,进一步扩大通道来提取数据
        self.conv2 = nn.Conv2d(96, 256, kernel_size=5, padding=2)
        self.pool2 = nn.MaxPool2d(kernel_size=3, stride=2)

        # 疯狂提取特征,连续用多个卷积层
        # kernel 5, padding 2, kernel 3, padding 1 可以维持住特征图的大小
        self.conv3 = nn.Conv2d(256, 384, kernel_size=3, padding=1)
        self.conv4 = nn.Conv2d(384, 384, kernel_size=3, padding=1)
        self.conv5 = nn.Conv2d(384, 256, kernel_size=3, padding=1)
        self.pool3 = nn.MaxPool2d(kernel_size=3, stride=2)

        # 进入全连接层,进行信息汇总
        self.fc1 = nn.Linear(6 * 6 * 256, 4096)  # 上层所有特征图上的所有像素
        self.fc2 = nn.Linear(4096, 4096)
        self.fc3 = nn.Linear(4096, 1000)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = self.pool1(x)

        x = F.relu(self.conv2(x))
        x = self.pool2(x)

        x = F.relu(self.conv3(x))
        x = F.relu(self.conv4(x))
        x = F.relu(self.conv5(x))
        x = self.pool3(x)

        x = x.view(-1, 6 * 6 * 256)  # 将数据拉平

        x = F.dropout(x, p=0.5)
        x = F.relu(F.dropout(self.fc1(x), p=0.5))
        x = F.relu(self.fc2(x))
        output = F.softmax(self.fc3(x), dim=1)

查看模型信息:

代码语言:javascript
复制
net = Model()
summary(net, input_size=(10, 3, 227, 227))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LeNet5
  • AlexNet
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档