深度学习之视觉特征提取器——LeNet

发布于:2024-04-30 ⋅ 阅读:(36) ⋅ 点赞:(0)

LeNet

引入

LeNet是是由深度学习巨头Yann LeCun在1998年提出,可以算作多层卷积网络在图像识别领域的首次成功应用。我们现在通常说的LeNet是指LeNet-5,最早的LeNet-1在1988年即开始研究,前后持续十年之久。但是,受限于当时计算机算力的发展,以及本有的SVM技术效果就十分优秀,这一技术并没有得到广泛重视。然而,在以卷积神经网络为基础构建起的计算机视觉的今天,不得不感慨,二十年后今天的LLM或者是什么模型,会成为曾经的CNN/LeNet。

模型结构

请添加图片描述

LeNet的模型结构如上图所示,LeNet最初是用在MNIST手写数据集上,对手写数字进行分辨。对于输入的32×32像素的手写数据图,首先利用卷积核为5×5的卷积层转化成28×28×6的特征图,通道数为6(就是有6个不同卷积核),再使用Sigmoid和2×2的最大池化Maxpool提取最为关键的特征信息,维度变成14×14。接着在使用卷积核为5×5的卷积层转化成10×10的特征图,通道数为16,再使用Sigmoid和2×2的最大池化Maxpool提取最为关键的特征信息,维度变成5×5×16。再将其全部展开成一维,并连接三个卷积层和Softmax激活函数得到10分类的概率值,选取概率最大的分类作为最终预测分类。更为详细的结构图如下所示:
请添加图片描述

值得注意的是,通过查阅维基百科(2024.4.30),其中卷积层之间以及全连接层之间是使用Sigmoid进行连接的而不是像网上一些博客中提到的ReLU,在此进行更正。

LeNet可以说为后续的特征提取器提供了一个范式。这个范式是先使用卷积层提取特征,通过不断缩小特征图尺寸以及增加通道数提取特征,并使用池化层提升泛化性防止过拟合。之后将这些特征展开成一维使用全连接层进行分类并使用Softmax输出预测概率。

实现代码

import torch
import torch.nn as nn
import torch.nn.functional as F

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=5)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.fc1 = nn.Linear(16 * 4 * 4, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = F.max_pool2d(F.sigmoid(self.conv1(x)), (2, 2))
        x = F.max_pool2d(F.sigmoid(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

# 创建LeNet模型实例
net = LeNet()
# 打印LeNet模型结构
print(net)


网站公告

今日签到

点亮在社区的每一天
去签到