Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PyTorch中Linear层的原理 | PyTorch系列(十六)

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

作者头像
AI算法与图像处理
发布于 2020-06-03 02:22:55
发布于 2020-06-03 02:22:55
10.4K00
代码可运行
举报
运行总次数:0
代码可运行

文 |AI_study

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

Linear 层是如何实现的

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

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

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

一、使用矩阵进行变换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 层来完成相同的操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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源代码来验证这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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张量来调用我们的层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> 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创建了一个权值矩阵,并使用随机值初始化它。这意味着这两个例子中的线性函数是不同的,所以我们使用不同的函数来产生这些输出。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fc.weight = nn.Parameter(weight_matrix)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> fc(in_features)
tensor([30.0261, 40.1404, 49.7643], grad_fn=<AddBackward0>)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.

可调用的层和神经网络

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> 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源代码中看看这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI算法与图像处理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
半小时学会 PyTorch Hook
提到 hook,我首先想起的是动画《小飞侠》里滑稽的 captain hook,满满童年的回忆促使我 P 了张题图:虎克船长勾着 PyTorch 的 logo。同时想起的还有大名鼎鼎的胡克定律:Hooke's law(虽然不是一个 hook),当年上物理实验课,看着弹簧测力计下面的钩子,联想到胡克被牛顿爵士打压的悲惨一生,不由发出既生胡何生牛的唏嘘……然而本文将介绍的是 PyTorch 中的 hook。
SIGAI学习与实践平台
2019/07/30
4.1K1
半小时学会 PyTorch Hook
[源码解析] PyTorch分布式优化器(1)----基石篇
我们接下来通过几篇文章来看看分布式优化器。本系列分为三篇文章,分别是基石篇,DP/DDP/Horovod 之中数据并行的优化器,PyTorch 分布式优化器,按照深度递进。
罗西的思考
2021/12/09
2K0
[源码解析] PyTorch分布式优化器(1)----基石篇
PyTorch专栏(二)
autograd 包是 PyTorch 中所有神经网络的核心。首先让我们简要地介绍它,然后我们将会去训练我们的第一个神经网络。该 autograd 软件包为 Tensors 上的所有操作提供自动微分。它是一个由运行定义的框架,这意味着以代码运行方式定义你的后向传播,并且每次迭代都可以不同。我们从 tensor 和 gradients 来举一些例子。
磐创AI
2019/09/05
1.1K0
PyTorch专栏(二)
PyTorch 60分钟入门系列之神经网络
前面的学习大致了解了autograd,nn依赖于autograd来定义模型并进行求导。一个nn.Module包含多个神经网络层,以及一个forward(input)方法来返回output。
AI异构
2020/07/29
4740
PyTorch 60分钟入门系列之神经网络
PyTorch神经网络中可学习的参数——CNN权重 | PyTorch系列(十五)
在本系列的最后几篇文章中,我们已经开始构建CNN,我们做了一些工作来理解我们在网络构造函数中定义的层。
AI算法与图像处理
2020/06/03
4.9K0
快速入门PyTorch(2)--如何构建一个神经网络
在 PyTorch 中 torch.nn 专门用于实现神经网络。其中 nn.Module 包含了网络层的搭建,以及一个方法-- forward(input) ,并返回网络的输出 outptu .
kbsc13
2019/08/16
4690
【深度学习】翻译:60分钟入门PyTorch(三)——神经网络
原文翻译自:Deep Learning with PyTorch: A 60 Minute Blitz
黄博的机器学习圈子
2021/02/12
7410
PyTorch 60-Minute Blitz
Tensors(张量)与 Numpy 的 ndarrays 类似,但是其支持在 GPU 上使用来加速计算。
口仆
2020/08/14
9020
最新翻译的官方 PyTorch 简易入门教程
https://github.com/fengdu78/machine_learning_beginner/tree/master/PyTorch_beginner
用户1737318
2019/11/19
1.5K0
最新翻译的官方 PyTorch 简易入门教程
pytorch 构建神经网络
神经网络由对数据执行操作的层或模块组成。torch.nn命名空间提供了构建神经网络所需的所有模块。PyTorch中的每个模块都是 nn.Module 的子类。神经网络本身也是一个模块,但它由其他模块(层)组成。这种嵌套结构允许轻松构建和管理复杂的架构。
程序猿川子
2022/10/25
4120
pytorch学习笔记(七):pytorch hook 和 关于pytorch backward过程的理解
ke1th
2018/01/02
3.5K0
PyTorch 学习 -4- 模型构建
Module 类是 torch.nn 模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想要的模型。
为为为什么
2023/07/20
4880
PyTorch 学习 -4- 模型构建
教程 | 从头开始了解PyTorch的简单实现
选自GitHub 机器之心编译 参与:路 本教程展示了如何从了解张量开始到使用 PyTorch 训练简单的神经网络,是非常基础的 PyTorch 入门资源。PyTorch 建立在 Python 和 Torch 库之上,并提供了一种类似 Numpy 的抽象方法来表征张量(或多维数组),它还能利用 GPU 来提升性能。本教程的代码并不完整,详情请查看原 Jupyter Notebook 文档。 PyTorch 使入门深度学习变得简单,即使你这方面的背景知识不太充足。至少,知道多层神经网络模型可视为由权重连接的节
机器之心
2018/05/08
3K0
教程 | 从头开始了解PyTorch的简单实现
60分钟快速入门PyTorch
本文是翻译自官方版教程--DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ,一份 60 分钟带你快速入门 PyTorch 的教程。
kbsc13
2020/05/22
1.2K0
60分钟快速入门PyTorch
【AICAMP —— Pytorch】看完就去搭网络!
张量和Numpy中ndarrays的概念很相似,有了这个作为基础,张量也可以被运行在GPU上来加速计算,下面直接可以感受下张量的创建与Numpy有什么样的区别。
灿视学长
2021/05/28
9400
PyTorch5:torch.nn总览&torch.nn.Module
PyTorch 把与深度学习模型搭建相关的全部类全部在 torch.nn 这个子模块中。
小胡胡说
2020/08/10
1.3K0
Deep Learning with PyTorch: A 60 Minute Blitz > Neural Networks
Neural networks can be constructed using the torch.nn package.
望天
2024/06/12
1580
Deep Learning with PyTorch: A 60 Minute Blitz > Neural Networks
【PyTorch】PyTorch如何构建和实验神经网络
在本文中,将展示一个简单的分步过程,以在PyTorch中构建2层神经网络分类器(密集连接),从而阐明一些关键功能和样式。
lujohn3li
2020/03/03
1.1K0
【PyTorch】PyTorch如何构建和实验神经网络
PyTorch基础介绍
PyTorch既是一个深度学习框架又是一个科学计算包,她在科学计算方面主要是PyTorch张量库和相关张量运算的结果。(张量是一个n维数组或者是一个n-D数组)PyTorch是一个张量库,她紧密地反映了numpy的多维数组功能,并且与numpy本身有着高度的互操作性。Pytorch中常用包的介绍
用户10722181
2023/11/21
2620
PyTorch的简单实现
PyTorch 的关键数据结构是张量,即多维数组。其功能与 NumPy 的 ndarray 对象类似,如下我们可以使用 torch.Tensor() 创建张量。如果你需要一个兼容 NumPy 的表征,或者你想从现有的 NumPy 对象中创建一个 PyTorch 张量,那么就很简单了。
代码的路
2022/06/18
2K0
PyTorch的简单实现
相关推荐
半小时学会 PyTorch Hook
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验