卷积神经网络之-Lenet

2023-11-16

更多内容请关注『机器视觉CV』公众号
原文地址

前言

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×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 概率值

image.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

卷积神经网络之-Lenet 的相关文章

  • python操作word——python-docx和python-docx-template模块

    前言 项目用到了导出文档 综合考虑使用python docx模块 目录 python docx 安装 docx文档布局词汇 三个部分 文档 段落 文字块 四级结构 表格 使用 导入word 读操作 获取段落 获取段落文本内容 获取文字块文本
  • AD铺铜中铺地选择异形铺铜方式

    在使用AD时 最后的一步铺铜 铺地 如果是矩形的板子 铺铜很简单 直接捕捉拐角点即可 但是一些异形的板子 就不是那么好办了 虽然可以全选铺铜 最后也不影响最后的PCBA实物 但是有强迫症的肯定会看着不舒服 比如我 所以找到一种快速铺异形板子
  • Go(一)变量和常量

    目录 标识符与关键字 标识符 关键字 变量 变量的来历 变量类型 变量声明 标准声明 批量声明 变量的初始化 类型推导 短变量声明 匿名变量 常量 iota 几个常见的iota示例 标识符与关键字 标识符 在编程语言中标识符就是程序员定义的

随机推荐

  • Spark数据处理实战之列空值&新增列处理

    在spark dataset dataframe操作过程中 我们经常会遇到对于一个列值的一些判断情况 是否为NULL 创建一个新列等 本文讲解了常用的增加列的方法 并且对于列空值判断 填充处理以及查询的api做了详细的描述和实例讲解 阅读完
  • 思科交换机密码破解

    年纪大了 总是忘记cisco交换机密码 现将我初始化cisco交换机密码的两大步13个小步骤记录如下 A 1 打开电脑中SecureCRT软件 或者下载windows7 超级终端 v1 01 绿色版 hypertrm exe 把port C
  • 人人都看得懂的正则表达式教程

    编写验证规则最流行和最简单的方法就是正则表达式了 但唯一的一个问题是正则表达式的语法太隐晦了 让人蛋疼无比 很多开发者为了在项目中应用复杂的验证 经常要使用一些小抄来记住正则式的复杂语法和各种常用命令 在这篇文章中 我将试图让大家明白什么是
  • uboot 设置环境变量

    1 使用命令 ipconfig 查看 windows 系统的 IP 2 使用命令 ifconfig 查看虚拟机 ubuntu 系统的 IP 3 串口登录 fs4412 的uboot 4 在uboot中输入命令 print 打印当前环境变量
  • 如何将栈中的元素输出

    首先需要写一个出栈函数 得到栈顶的值 才能将其输出 bool Pop SqStack s ElemType e if s gt top 1 return false e s gt data s gt top s gt top return
  • android启动优化

    主题 我们今天讨论的主题是 使用第三方工具 CPU Profile 来优化app的启动时间 背景 想要进行app的启动优化有一点必须要知道的就是Android的启动流程和启动状态 启动流程 Android的启动流程相关的知识点 各位可以去查
  • MySQL索引1

    索引最大作用就是提高对表中数据的查询速度 就像书的目录那样重要 可以快速查到所需的知识 上面是11万多条数据的表 使用语句查询 如 耗时 0 108s 再比如 用时 0 004s 接下来创建索引 在t book上右键 选择管理索引 选择新建
  • 基于vue 2.X和高德地图的vue-amap组件获取经纬度

    今天我就讲了一下怎么通过vue和高德地图开发的vue amap组件来获取经纬度 这是vue amap的官网文档 https elemefe github io vue amap 这是我的码云项目的地址 http git oschina ne
  • MySQL函数和存储过程

    MySQL流程控制函数 1 IF函数 IF expr1 expr2 expr3 如果expr1是真 返回expr2 否则返回expr3 SELECT name IF age gt 18 成年 未成年 FROM user 2 IFNULL函数
  • 给Qt程序添加管理员权限总结(一定有你没见过的方式)

    当我们写了一个Qt程序 程序会在C盘某些目录下创建文件时 会发现代码没有问题 但是就是创建失败 而当我们对程序右键 以管理员权限运行时 又可以正常创建文件 此时 说明我们的程序默认不具备管理员权限 故而无法对某些目录进行写入 根据我们的编译
  • 温酒读Qt:QObject 序篇

    一 醉言醉语话夏娃 跟Qt框架打了这么久交道 Qt貌似对我的半斤八两知根知底 我对Qt的认知却还不到半斤八两 o o 或许你知道Qt的meta object和属性系统 或许你在写代码时无数次显示或者隐示的继承了QObject 不管人家是否乐
  • 数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案

    SQL SERVER数据库故障类型 1 SQL SERVER数据库文件被删除 2 SQL SERVER数据库所在分区格式化 3 SQL SERVER数据库文件大小变为 0 4 使用备份还原数据库时覆盖原数据库 SQL SERVER数据库故障
  • Sublime Text 中Anaconda 插件的Python语法配置

    在Ubuntu环境下Sublime Text 配置Anaconda 插件自动检查Python3语法 在Ubuntu16 04环境下使用Sublime Text 写Python3程序 已安装了Anaconda 插件包 通过配置Anaconda
  • Fabric java sdk 1.4简明教程

    在超级账本Fabric区块链中 应用通过节点的RPC协议接口访问链码 Java应用可以使用官方提供的Fabric sdk java开发包来实现对链码的访问 开发包封装了Fabric区块链的GRPC链码访问协议 有利于开发人员聚焦于业务逻辑
  • TCP报文的交互过程

    TCP建立连接和断开连接的过程如下图所示 在TCP 协议提供可靠的连接服务时 采用三次握手建立一个连接 采用四次握手来关闭一个连接 建立TCP连接的三次握手 第一次握手 建立连接时 客户端发送 SYN 包到服务器 等待服务器确认 第二次握手
  • Docker的简介、镜像及优化

    1 docker的安装 1 配置yum源 vim etc yum repo d docker ce repo 编辑内容 vim etc yum repo d CentOS Base repo 编辑内容 2 安装docker yum inst
  • 医疗保健行业中的区块链

    区块链技术是世界上最重要和最具颠覆性的技术之一 多个行业正在采用区块链技术来创新其运作方式 希望采用区块链的行业之一是医疗保健行业 在本指南中 我们将熟悉区块链 特别是有助于打破这个行业原有桎梏的功能 此外 我们将研究医疗行业的未来将会是什
  • 推荐系统实践(八)----评分预测

    目前为止都是在讨论 T o p N TopN TopN 推荐 即给定一个用户 如何给他生成一个长度为 N N
  • JVM 内存模型

    JVM 内存模型 1 JVM 内存模型共分为5个区 Java虚拟机栈 本地方法栈 堆 程序计数器 方法区 元空间 2 各个区各自的作用 a 本地方法栈 用于管理本地方法的调用 里面并没有我们写的代码逻辑 其由native修饰 由 C 语言实
  • 卷积神经网络之-Lenet

    更多内容请关注 机器视觉CV 公众号 原文地址 前言 Lenet 是一系列网络的合称 包括 Lenet1 Lenet5 由 Yann LeCun 等人在1990 年 Handwritten Digit Recognition with a