PyTorch中Linear层的原理 | PyTorch系列(十六)

2023-05-16

点击上方“AI算法与图像处理”,选择加"星标"或“置顶”

重磅干货,第一时间送达

文 |AI_study

原标题:PyTorch Callable Neural Networks - Deep earning In Python

Linear 层是如何实现的

在上一篇文章中,我们学习了 Linear 层如何使用矩阵乘法将它们的输入特征转换为输出特征。

当输入特征被一个Linear 层接收时,它们以一个 展平成一维张量的形式接收,然后乘以权重矩阵。这个矩阵乘法产生输出特征。

让我们看看代码中的一个例子。

一、使用矩阵进行变换

in_features = torch.tensor([1,2,3,4], dtype=torch.float32)


weight_matrix = torch.tensor([
    [1,2,3,4],
    [2,3,4,5],
    [3,4,5,6]
], dtype=torch.float32)


> weight_matrix.matmul(in_features)
tensor([30., 40., 50.])

在这里,我们创建了一个一维张量,叫做in_features。我们还创建了一个权重矩阵当然是一个二维张量。然后,我们使用matmul()函数来执行生成一维张量的矩阵乘法运算。

一般来说,权重矩阵定义了一个线性函数,它把一个有四个元素的一维张量映射成一个有三个元素的一维张量。

这也是Linear 层的工作原理。它们使用权重矩阵将一个in_feature空间映射到一个out_feature空间。

二、使用PyTorch线性层进行转换

让我们看看如何创建一个PyTorch的 Linear 层来完成相同的操作。

fc = nn.Linear(in_features=4, out_features=3, bias=False)

这里,我们有了。我们已经定义了一个线性层,它接受4个输入特征并把它们转换成3个输出特征,所以我们从4维空间转换到3维空间。我们知道需要一个权重矩阵被用执行这个操作,但是在这个例子中权重矩阵在哪里呢?

我们将权重矩阵放在PyTorch LinearLayer类中,是由PyTorch创建。PyTorch LinearLayer类使用传递给构造函数的数字4和3来创建一个3 x 4的权重矩阵。让我们通过查看PyTorch源代码来验证这一点。

# torch/nn/modules/linear.py (version 1.0.1)


def __init__(self, in_features, out_features, bias=True):
    super(Linear, self).__init__()
    self.in_features = in_features
    self.out_features = out_features
    self.weight = Parameter(torch.Tensor(out_features, in_features))
    if bias:
        self.bias = Parameter(torch.Tensor(out_features))
    else:
        self.register_parameter('bias', None)
    self.reset_parameters()

正如我们所看到的,当我们用一个3×4矩阵乘以一个4×1矩阵时,结果是一个3×1矩阵。这就是PyTorch以这种方式构建权重矩阵的原因。这些是矩阵乘法的线性代数规则。

我们来看看如何通过传递in_features张量来调用我们的层。

> fc(in_features)
tensor([-0.8877,  1.4250,  0.8370], grad_fn=<SqueezeBackward3>)

我们可以这样调用对象实例,因为PyTorch神经网络模块是可调用的Python对象。稍后我们将更详细地研究这个重要的细节,但是首先,检查这个输出。我们确实得到了一个包含三个元素的一维张量。然而,产生了不同的值。

 callable Python objects. :https://en.wikipedia.org/wiki/Callable_object

这是因为PyTorch创建了一个权值矩阵,并使用随机值初始化它。这意味着这两个例子中的线性函数是不同的,所以我们使用不同的函数来产生这些输出。

记住权矩阵中的值定义了线性函数。这演示了在训练过程中,随着权重的更新,网络的映射是如何变化的。

让我们显式地将线性层的权值矩阵设置为与我们在另一个示例中使用的权值矩阵相同。

fc.weight = nn.Parameter(weight_matrix)

PyTorch模块的权值需要是参数。这就是为什么我们把权矩阵张量放在一个参数类实例中。现在让我们看看这一层如何使用新的权重矩阵转换输入。我们希望看到与前面示例相同的结果。

> fc(in_features)
tensor([30.0261, 40.1404, 49.7643], grad_fn=<AddBackward0>)

这一次我们更接近于30、40和50的值。然而,我们确切。这是为什么呢?这是不精确的因为线性层在输出中加入了一个偏置张量。观察当我们关闭偏差时会发生什么。我们通过向构造函数传递一个假标记来做到这一点。

fc = nn.Linear(in_features=4, out_features=3, bias=False)
fc.weight = nn.Parameter(weight_matrix)
> fc(in_features)
tensor([30., 40., 50.], grad_fn=<SqueezeBackward3>)

现在,我们有一个精确的匹配。这就是Linear 层的工作原理。

三、线性变换的数学符号

有时我们会看到 Linear 层操作被称为

y=Ax+b.

在这个方程中,我们有:

我们会注意到这与直线方程相似

y=mx+b.

可调用的层和神经网络

我们之前指出过,我们把层对象实例当作一个函数来调用是多么奇怪。

> fc(in_features)
tensor([30.0261, 40.1404, 49.7643], grad_fn=<AddBackward0>)

使这成为可能的是PyTorch模块类实现了另一个特殊的Python函数,称为__call__()。如果一个类实现了__call__()方法,那么只要对象实例被调用,这个特殊的调用方法就会被调用。

这个事实是一个重要的PyTorch概念,因为在我们的层和网络中,__call __()与forward()方法交互的方式是用的。

我们不直接调用forward()方法,而是调用对象实例。在对象实例被调用之后,在底层调用了__ call __方法,然后调用了forward()方法。这适用于所有的PyTorch神经网络模块,即网络和层。

让我们在PyTorch源代码中看看这一点。

# torch/nn/modules/module.py (version 1.0.1)


def __call__(self, *input, **kwargs):
    for hook in self._forward_pre_hooks.values():
        hook(self, input)
    if torch._C._get_tracing_state():
        result = self._slow_forward(*input, **kwargs)
    else:
        result = self.forward(*input, **kwargs)
    for hook in self._forward_hooks.values():
        hook_result = hook(self, input, result)
        if hook_result is not None:
            raise RuntimeError(
                "forward hooks should never return any values, but '{}'"
                "didn't return None".format(hook))
    if len(self._backward_hooks) > 0:
        var = result
        while not isinstance(var, torch.Tensor):
            if isinstance(var, dict):
                var = next((v for v in var.values() if isinstance(v, torch.Tensor)))
            else:
                var = var[0]
        grad_fn = var.grad_fn
        if grad_fn is not None:
            for hook in self._backward_hooks.values():
                wrapper = functools.partial(hook, self)
                functools.update_wrapper(wrapper, hook)
                grad_fn.register_hook(wrapper)
    return result

PyTorch在__ call __()方法中运行的额外代码就是我们从不直接调用forward()方法的原因。如果我们这样做,额外的PyTorch代码将不会被执行。因此,每当我们想要调用forward()方法时,我们都会调用对象实例。这既适用于层,也适用于网络,因为它们都是PyTorch神经网络模块。

现在可以实现网络的forward()方法了。

文章中内容都是经过仔细研究的,本人水平有限,翻译无法做到完美,但是真的是费了很大功夫,希望小伙伴能动动你性感的小手,分享朋友圈或点个“在看”,支持一下我 ^_^

英文原文链接是:

https://deeplizard.com/learn/video/rcc86nXKwkw

加群交流

欢迎小伙伴加群交流,目前已有交流群的方向包括:AI学习交流群,目标检测,秋招互助,资料下载等等;加群可扫描并回复感兴趣方向即可(注明:地区+学校/企业+研究方向+昵称)

 谢谢你看到这里! ????

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

PyTorch中Linear层的原理 | PyTorch系列(十六) 的相关文章

  • Oracle(二)之视图的使用

    概述 什么是视图 视图可以理解为一张虚拟表 xff0c 它是由固定的sql查询语句操作真实表得到的一个临时表 视图中的数据就是查询sql语句的结果 得到视图之后 xff0c 我们可以使用sql操作视图 xff0c 但只能是查询操作 查询视图
  • CMUX 软件包发布 | 不一样的串口复用

    1 什么是 CMUX CMUX xff08 Connection Multiplexing xff09 xff0c 即连接 xff08 串口 xff09 多路复用 xff0c 其功能主要在一个真实的物理通道上虚拟多个通道 xff0c 每个虚
  • Linux中使用curl命令发送带参数的get请求和post请求

    1 curl与wget 命令的区别 相似之处 xff1a wget 和 cURL 都可以下载内容 xff0c 都可以向互联网发送请求并返回请求项 xff0c 也可以进行 HTTP POST 请求 xff0c 它们都是命令行工具 xff0c
  • STM32片上Flash内存映射、页面大小、寄存器映射

    本文以STM32F103RBT6为例介绍了片上Flash Embedded Flash 若干问题 xff0c 包括Flash大小 内存映射 块大小 页面大小 寄存器 二 块大小 Flash先分块再分页 xff0c 擦除是按块进行 xff0c
  • keil 修改RAM、ROM

  • 单片机flash不足,keil如下方式进行优化

    单片机的flash不够的时候可以使用keil的优化等级进行优化 xff1b 但是使用Opt进行优化的时候会遇到难以预料的错误 xff0c 所以使用时要对一些变量进行标识 xff0c 比如使用volatile关键字 还有其他方式也能减少内存的
  • msp430看门狗定时器

    看门狗定时器用来防止程序因供电电源 空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故 在很多单片机中都内置了看门狗 xff0c 看门狗本身是一个定时器 xff0c 当定时器溢出时即进行系统复位 xff0c 因此需要在程序中对看门狗定时器
  • UART、SPI和IIC详解与比较(超级实用的调试经验)

    1 UART UART有4个pin xff08 VCC GND RX TX xff09 用的TTL电平 低电平为0 0V xff0c 高电平为1 xff08 3 3V或以上 xff09 UART使用的是异步串行通信 UART是两线 xff0
  • RS232、RS485和CAN协议总结与对比

    一 RS232串口是计算机上一种非常通用的设备通信协议 串口的电气特性 xff1a 1 RS 232串口通信最远距离是50英尺 xff1b 2 RS232可做到双向传输 xff0c 全双工通讯 xff0c 最高传输速率20kbps xff1
  • STM32 GPIOx_CRL/GPIOx_CRH 寄存器

    GPIOx CRL GPIOx CRH xff08 x xff1a A F xff09 寄存器用来对GPIO进行端口设置 xff0c 如 xff1a 设置GPIO为输入模式或输出模式 每个寄存器含有32位 xff0c 每4位用来设置1个GP
  • SHT10 温湿度传感器的程序以及调试总结

    没有其他东西 直接上调试注意事项和代码 xff01 xff01 调试要点 xff1a 1 DATA加10K上拉电阻 2 注意示波器观察各个信号 基础要点 xff1a 1 串行时钟输入 xff08 SCK xff09 单片机模拟时钟 2 串行
  • 晶振原理解析

    目录 01 压电效应 02 晶体振荡器的应用 03 无源晶振和有源晶振的区别 04 STM32外接晶振 下文将进一步讲解晶振的原理 xff0c 以及晶振和STM32的关系 01 压电效应 压电效应 xff1a 某些电介质在沿一定方向上受到外
  • 字符串大小的比较

    字符串大小比较的步骤 xff1a 从左至右一位一位比较 xff0c 如果相同 xff0c 则继续下一位 xff0c 如果不同 xff0c 则谁的ASCII大谁的字符串就大如果比较到其中一者已经结束了 xff0c 还没有分出大小 xff0c
  • STM32延时函数的四种方法

    目录 1 普通延时 2 定时器中断 3 查询定时器 4 汇编指令 单片机编程过程中经常用到延时函数 xff0c 最常用的莫过于微秒级延时delay us 和毫秒级delay ms 本文基于STM32F207介绍4种不同方式实现的延时函数 1
  • STM32的FSMC外设简介

    目录 01 FSMC特点 02 AHB接口 03 外部设备地址映射 04 NOR PSRAM控制器 05 外部存储器接口信号 06 NOR PSRAM控制器异步事务 07 模式1 08 模式A 09 代码说明 01 FSMC特点 Flexi
  • STM32使用DMA接收串口数据

    目录 01 概述 02 DMA接收 03 中断 04 代码 01 概述 在之前的文章里 STM32串口详解 和 STM32 DMA详解 文章中 xff0c 详细讲解了STM32的串口和DMA外设 xff0c 本篇文章将不在细述串口和DMA的
  • 指针与数组

    1 定义 指针 xff1a C语言中某种数据类型的数据存储的内存地址 xff0c 例如 xff1a 指向各种整型的指针或者指向某个结构体的指针 数组 xff1a 若干个相同C语言数据类型的元素在连续内存中储存的一种形态 数组在编译时就已经被
  • 关于软件定时器的一些讨论

    1 简介 这里先介绍下软件定时器和硬件定时器的区别 硬件定时器 xff1a CPU内部自带的定时器模块 xff0c 通过初始化 配置可以实现定时 xff0c 定时时间到以后就会执行相应的定时器中断处理函数 硬件定时器一般都带有其它功能 xf
  • 表驱动法在STM32中的应用

    1 概念 所谓表驱动法 Table Driven Approach 简而言之就是用查表的方法获取数据 此处的 表 通常为数组 xff0c 但可视为数据库的一种体现 根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法 xff0c 即以
  • 关于共享资源保护的思考

    1 引言 先聊聊分享这篇文章的原因 xff0c 在使用STM32时 xff0c 我发现对于GPIO输出操作 xff0c 可以使用GPIOx ODR寄存器 xff0c 也可以使用GPIOx BSRR寄存器 对应的标准外设库API接口有 voi

随机推荐

  • 预编译#error的使用

    1 引言 说到预编译 xff0c 大家立刻就能想到 define if ifdef和 ifndef等熟悉的预编译命令 其实 include xff0c 我们通常放在源文件用来包含头文件 xff0c 它也是预编译命令 当然这不是这篇文章的重点
  • STM32 IIC详解

    目录 1 IIC定义 2 IIC协议规范 2 1 SDA和SCL信号 2 2 数据有效性 2 3 开始和结束信号 2 4 字节格式 2 5 从机地址和读写位 3 计算IIC的频率 4 PCF8536 4 1 Acknowledge 4 2
  • STM32 SPI详解

    目录 1 SPI简介 2 SPI特点 2 1 SPI控制方式 2 2 SPI传输方式 2 3 SPI数据交换 2 4 SPI传输模式 3 工作机制 3 1 相关缩写 3 2 CPOL极性 3 3 CPHA相位 3 4 极性和相位图示 3 5
  • STM32移植LWIP

    目录 01 IAR工程移植 02 修改Keil工程 在上篇文章 LWIP初体验 修改ST官方demo 中我们已经在自己的开发板上实现了简单的TCPsever和TCPclient功能 验证完了硬件 xff0c 接下来的工作就是优化代码 xff
  • 树莓派4B交叉编译工具链安装

    目录 一 安装配置环境介绍 xff1a 1 宿主机环境 xff1a 2 树莓派系统 xff1a 二 获取交叉编译工具链 xff1a 1 从GitHub下载 不推荐 xff1a 1 xff09 下载必要的软件和工具 xff1a 2 xff09
  • 一种复用模块原理图的设计方法(Port)

    在看一个参考设计时 xff0c 发现一种通过使用port来进行Pin Map 从而让子模块图保持干净 xff0c 以便重复利用的方法 子模块图如下 xff1a 在该图左边 xff0c 通过Port符号 xff0c 将芯片所有的信号管脚 xf
  • SourceTree 设置内置对比视图 不diff大文件

    有时候会往仓库里添加pdf rar等格式的大文件 xff0c 本来diff也看不出个差别来 xff0c 但在sourceTree里面添加时 xff0c 软件会自动去做diff xff0c 如果这类文档很大 xff0c 就会导致soucetr
  • win10 docker desktop运行故障自诊断

    在docker desktop运行出错时 xff0c 程序里有一个诊断工具用于本地诊断 xff0c 使用管理员权限打开powershell xff0c 然后依次执行如下语句 xff1a cd 34 C Program Files Docke
  • STC 8051单片机扩展SRAM介绍、使用以及配置

    总述 STC8051系列单片机中很多具有内部扩展的数据存储器SRAM xff08 单片机内部的RAM一般都是SRAM xff0c 区别于SDRAM xff0c 下面叙述中的RAM xff0c 即表示SRAM xff09 xff0c 所谓的内
  • 光电传感器ST188使用总结

    ST188是我接触的第一款红外光电传感器 xff0c 并在很多场合能够很好地发挥作用 首先说一下 xff0c 光电传感器的种类很多 基本的工作原理都是利用光敏二极管接收到一定的红外光信号来实现检测的 按照光电传感器的入光方式 xff0c 可
  • STC管脚上电如何输出低电平

    最近在做一个项目 xff0c 其中电路板部分功能原理是 xff0c STC MCU直接连接ULN2003 xff0c 再驱动ULN2003控制继电器 本来一切正常的 xff0c 后面在细调的时候发现有一个问题 xff0c 就是在电路板上电瞬
  • C++ STL与文件处理操作总结

    STL 标准库 xff0c 英文为Standard Template Library 广义上讲分为三类 xff0c algorithm xff08 算法 xff09 container xff08 容器 xff09 iterator xff
  • 字节序和位序(大小端)

    Endianness 字节序大家见得比较多 xff0c 网络上论述也比较多 这里简要介绍 xff1a 书写十六进制数据时 xff0c 我们习惯上 MSB 在左 xff0c 而 LSB 在右 LSB least significant byt
  • 使用makefile替换Keil进行编译

    KEIL PATH 61 C Keil ARM ARMCC 61 KEIL PATH BIN40 armcc ARMASM 61 KEIL PATH BIN40 armasm ARMAR 61 KEIL PATH BIN40 armar A
  • [C++][原创]ubuntu上C++发送http请求get和post

    找到一个开源项目 xff1a GitHub elnormous HTTPRequest Single header C 43 43 HTTP request class 使用项目都有介绍 xff0c 很简单 xff0c 这里我在ubuntu
  • 网络通信编程(UDP和TCP协议的实现)

    网络通信 1 网络编程入门1 1网络编程概述1 2网络编程三要素第一要素第二要素第三要素 1 3IP地址 xff08 网络中设备的唯一标识 xff09 常用命令特殊IP地址 1 4InetAddress类的使用 xff08 为了方便对IP地
  • STM32F0 HAL库的串口中断调用顺序

    首先在主函数里执行发送中断或者接收中断函数 xff1a HAL UART Receive IT amp UartHandle uint8 t RxBuf 1 HAL UART Transmit IT amp UartHandle uint8
  • 最全综述 | 图像分割算法

    点击上方 AI算法与图像处理 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 图像分割是计算机视觉研究中的一个经典难题 xff0c 已经成为图像理解领域关注的一个热点 xff0c 图像分割是图像分析的第一
  • CNN的Flatten操作 | Pytorch系列(七)

    点击上方 AI算法与图像处理 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 文 AI study 欢迎回到这个关于神经网络编程的系列 在这篇文章中 xff0c 我们将可视化一个单一灰度图像的张量flat
  • PyTorch中Linear层的原理 | PyTorch系列(十六)

    点击上方 AI算法与图像处理 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 文 AI study 原标题 xff1a PyTorch Callable Neural Networks Deep earn