专栏首页机器视觉CV卷积神经网络之 - Lenet

卷积神经网络之 - Lenet

前言

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

Lenet5

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

Lenet-5 网络结构

代码复现

Lenet 网络的参数量,以及每层的输出特征图大小如下:

  • 卷积的卷积核都为 5×5 步长 stride=1
  • 输入是 32×32
  • -> 6@28*28(卷积 C1) 参数:5×5×6+6 =156
  • -> 6@14*14(池化 S2) 参数:偏移量参数 2×6
  • -> 16@10*10(卷积 C3) 参数:5×5×6×16+16 = 2416 # 这里与原始的 LeNet 网络有区别
  • -> 16@5*5(池化 S4) 参数:偏移量参数 2×16
  • -> 120@1*1(卷积 C5)当然,这里也可以认为是全连接层(因为上一层得到的特征图是 5x5,卷积核也为 5x5) 参数:5×5×16×120+120 = 48120
  • -> 84(全连接 F6) 这个 84 的选取有个背景:与 ASCII 码表示的 7×12 的位图大小相等 参数:120×84
  • -> 10 (输出类别数) 参数:84×10

下面我们用 Pytorh 框架实现一些 Lenet5,实际代码会与上面的说明有些差别,并模拟一个输入进行测试。

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)

最后模拟了一个输入,输出一个分类器运算后的结果和 10 个 softmax 概率值

输出结果

未完待续

本文分享自微信公众号 - 机器视觉CV(Unfinished_coder),作者:Leong

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 卷积神经网络之-NiN 网络(Network In Network)

    Network In Network 是发表于 2014 年 ICLR 的一篇 paper。当前被引了 3298 次。这篇文章采用较少参数就取得了 Alexne...

    机器视觉CV
  • 【注意力机制】空间注意力机制之Spatial Transformer Network

    2015 NIPS(NeurIPS,神经信息处理系统大会,人工智能领域的 A 类会议)论文

    机器视觉CV
  • 【多目标跟踪】搞不懂MOT数据集,会跑代码有啥用!

    数据集用的最多的是 MOTChallenge,专注于行人追踪的。https://motchallenge.net/

    机器视觉CV
  • 【动手学深度学习笔记】之构造MLP模型的几种方法

    Module类是nn模块里提供的一个模型构造类,通过继承Module实现MLP的程序如下

    树枝990
  • 开发 | 深度学习自动编码器还能用于数据生成?这篇文章告诉你答案

    AI 科技评论按:本文作者廖星宇,原载于作者知乎专栏,经授权发布。 什么是自动编码器 自动编码器(AutoEncoder)最开始作为一种数据的压缩方法,其特...

    AI科技评论
  • 深度学习自动编码器还能用于数据生成?这篇文章告诉你答案

    什么是自动编码器 自动编码器(AutoEncoder)最开始作为一种数据的压缩方法,其特点有: 跟数据相关程度很高,这意味着自动编码器只能压缩与训练数据相似...

    AI研习社
  • 花式解释AutoEncoder与VAE

    什么是自动编码器 自动编码器(AutoEncoder)最开始作为一种数据的压缩方法,其特点有: 1、跟数据相关程度很高,这意味着自动编码器只能压缩与训练数据相似...

    用户1332428
  • Datawhale 零基础入门CV赛事-Task5 模型集成

    在机器学习中的集成学习可以在一定程度上提高预测精度,常见的集成学习方法有Stacking、Bagging和Boosting,同时这些集成学习方法与具体验证集划分...

    致Great
  • 网络编程懒人入门(六):深入浅出,全面理解HTTP协议

    HTTP(全称超文本传输协议,英文全称HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这...

    JackJiang
  • pygame-KidsCanCode系列jumpy-part8-记录历史最高分

    通常在多玩家的游戏中,每个玩家都会有自己的得分,最高分数会成为该游戏的最佳记录。这一篇,学习下如何记录最高得分:(为了简化代码,本文采用文件方式,仅记录本机得分...

    菩提树下的杨过

扫码关注云+社区

领取腾讯云代金券