IE盒子

搜索
查看: 79|回复: 2

卷积神经网络之Lenet

[复制链接]

2

主题

7

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2023-3-5 12:49:01 | 显示全部楼层 |阅读模式
一、[Lenet](卷积神经网络之Lenet - 知乎 (zhihu.com))
二、[Alexnet](卷积神经网络之Alexnet - 知乎 (zhihu.com))
三、[VGG](卷积神经网络之VGG - 知乎 (zhihu.com))
前言

Lenet 是一系列网络的合称,包括 Lenet1 - Lenet5,由 Yann LeCun 等人在 1990 年《Handwritten Digit Recognition with a Back-Propagation Network》中提出,是卷积神经网络的 HelloWorld。
一、Lenet5网络结构

Lenet是一个 7 层的神经网络,包含 3 个卷积层,2 个池化层,1 个全连接层。其中所有卷积层的所有卷积核都为 5x5,步长 strid=1,池化方法都为全局 pooling,激活函数为 Sigmoid,网络结构如下:





Lenet-5网络结构

特点:
1.相比MLP,LeNet使用了相对更少的参数,获得了更好的结果。
2.设计了maxpool来提取特征
二、Lenet的keras实现

如今各大深度学习框架中所使用的LeNet都是简化改进过的LeNet-5,和原始的LeNet有些许不同,把激活函数改为了现在很常用的ReLu。LeNet-5跟现有的conv->pool->ReLU的套路不同,它使用的方式是conv1->pool->conv2->pool2再接全连接层,但是不变的是,卷积层后紧接池化层的模式依旧不变。
def LeNet():
    model = Sequential()
    # 原始的Lenet此处卷积核数量为6,且激活函数为线性激活函数
    model.add(Conv2D(32, (5,5), strides=(1,1), input_shape=(28,28,1), padding='valid', activation='relu', kernel_initializer='uniform'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    # 原始的Lenet此处卷积核数量为16,且激活函数为线性激活函数
    model.add(Conv2D(64, (5,5), strides=(1,1), padding='valid', activation='relu', kernel_initializer='uniform'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Flatten())
    model.add(Dense(100, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    return model三、Lenet的pytorch实现

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

class LeNet5(nn.Module):
    def __init__(self, num_classes, grayscale=False):
        """
        num_classes: 分类的数量
        grayscale:是否为灰度图
        """
        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.MaxPool2d(kernel_size=2),
            nn.Conv2d(6, 16, kernel_size=5),
            nn.MaxPool2d(kernel_size=2)   # 原始的模型使用的是 平均池化
        )
        # 分类器
        self.classifier = nn.Sequential(
            nn.Linear(16*5*5, 120),  # 这里把第三个卷积当作是全连接层了
            nn.Linear(120, 84),
            nn.Linear(84, num_classes)
        )

    def forward(self, x):
        x = self.features(x) # 输出 16*5*5 特征图
        x = torch.flatten(x, 1) # 展平 (1, 16*5*5)
        logits = self.classifier(x) # 输出 10
        probas = F.softmax(logits, dim=1)
        return logits, probas



num_classes = 10  # 分类数目
grayscale = True  # 是否为灰度图
data = torch.rand((1, 1, 32, 32))
print("input data:\n", data, "\n")
model = LeNet5(num_classes, grayscale)
logits, probas = model(data)
print("logits:\n",logits)
print("probas:\n",probas)愿天下没有空闲的显卡~
每日一句毒鸡汤:
我们清楚地知道快感和幸福感的不同,我们也知道欲望和需求是两个东西,但是我们不幸福却是因为不小心把快感当成了幸福感,把欲望当成了需求,而这就是因为我们常常站在现在的视角去想象未来的感受!
本次推荐:
超级简历,一个免费的简历制作网站!
继续加油~
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-5 12:49:46 | 显示全部楼层
2个全连接层吧
回复

使用道具 举报

3

主题

6

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-3-5 12:50:41 | 显示全部楼层
卷积核跟feature map大小一样的卷积,等效于全连接。所以说lenet5由3个卷积2个连接构成,或者由2个卷积3个全连接构成都行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表