PyTorch源码学习系列 - 2. Tensor

本系列文章会优先发布于微信公众号和知乎专栏,欢迎大家关注

微信公众号:小飞怪兽屋

知乎:  PyTorch源码学习 - 知乎 (zhihu.com)


目录

前言

Tensor是什么?

Tensor如何存储?

PyTorch眼中的Tensor

Tensor的创建过程

Tensor的函数与方法


前言

如果有人问我刚开始接触PyTorch该从何处学起时,我的回答一定不会是举世瞩目,让人惊叹不已的神经网络(NN, Neural Network),也不会是不明觉厉,精巧设计的梯度自动求导系统(Autograd),反而恰恰是平淡无奇,却无处不在的张量(Tensor)。正如所有人学习编程所做的第一件事情就是在控制台输出“Hello World”一样,Tensor就是PyTorch的“Hello World” ,每一位初学者在接触PyTorch时所做的第一件事就是用torch.tensor函数创建一个属于自己的Tensor。

import torch
torch.tensor([1,2,3])

当我们写下上面这段代码的时候,我们就已经开始走进PyTorch的宏观世界,我们利用PyTorch提供的函数创建了一个Tensor对象。但是,不知你们是否曾好奇过Tensor是如何创建的,是否曾想过Tesnor是如何存储的,是否曾探究过Tensor是如何设计的 ?今天,就让我们深入研究上面这段代码,一起走入Tensor的微观世界。

Tensor是什么?

在深入研究之前让我们先来简单回顾下Tensor是什么?从数学角度上来说,Tensor本质上是一个多维向量。在数学里,一个数我们称之为标量,一维数据我们称之为向量,二维数据我们称之为矩阵,到三维及更高维度的时候,我们并没有为每一个维度数据都提供一个专有名称,我们将这些包含维度信息的数据统称为张量(Tensor)。

Tensor

从图上可以看出,标量就是0维的Tensor,向量是1维的Tesnor,矩阵是二维的Tensor。在介绍Tensor的时候我们引入一个叫做维度的抽象概念,维度本质上是衡量事物的一种方式。比如时间就是一种维度,假如我们在网上卖东西,每天晚上都要汇总今天的销售额,我们就可以得到销售额相对于时间的关系,这里销售额就是基于时间的一维Tensor。当我们觉得销售额不仅仅和时间有关系,可能还和当天的客户访问量有关系,我们就又引入了一种维度,可以得到销售额与(时间,访问量)之间的关系,我们就建立一个二维的Tensor。Tensor就是用来表示这种多维数据的一种抽象概念,在不同的场景下具有不同的物理含义。在空间上,它是表示长宽高的三维tensor;在RGB颜色上,它是表示红绿蓝的三维Tensor;在语音通话中,它是表示时间与语音信息的二维Tensor。

Tensor如何存储?

当我们了解了Tensor的概念后,那该如何在计算机中存储包含多维信息的Tensor呢?当程序在计算机中运行时,我们需要将程序代码,程序运行需要的数据以及程序运行过程中生成的数据加载到内存中,所以我们可以得出一个结论,存储Tensor的物理媒介是内存(GPU上是显存),内存是一块可供寻址的存储单元。在我们设计Tensor的存储方案时,我们需要先弄清Tensor的特性:

  1. Tensor需要支持随机访问。这很重要,因为在Python中Tensor是支持索引(index)和切片(slice)操作的,支持随机访问可以让我们快速的找到需要的数据,提高我们数据访问效率
  2. Tensor的大小是固定的。当我们创建了一个Tensor的时候,它的大小就已经确定了,我们可以修改其上的任意元素,就是不能增加元素来修改它的大小。如果要修改其大小,我们必须根据其大小创建一个新的Tensor,将旧的Tensor上的数据复制过去

说到这里大家是不是觉得很熟悉?没错,就是在数据结构课上学到的第一个数据结构,数组。当我们创建一个数组的时候,我们会向内存申请一块指定大小的连续存储空间,而这恰恰就是PyTorch中Strided Tensor的存储方式。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BN层是一种在深度学习中常用的归一化方法,它能够使得网络的输入在训练过程中保持一定的分布,提高训练的收敛速度和稳定性。PyTorch中的BN层的码实现如下: ```python class BatchNorm(nn.Module): def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True, track_running_stats=True): super(BatchNorm, self).__init__() self.num_features = num_features self.eps = eps self.momentum = momentum self.affine = affine self.track_running_stats = track_running_stats if self.affine: self.weight = nn.Parameter(torch.Tensor(num_features)) self.bias = nn.Parameter(torch.Tensor(num_features)) if self.track_running_stats: self.running_mean = torch.zeros(num_features) self.running_var = torch.ones(num_features) def forward(self, x): if self.training and self.track_running_stats: mean = x.mean(dim=0) var = x.var(dim=0) self.running_mean = (1 - self.momentum) * self.running_mean + self.momentum * mean self.running_var = (1 - self.momentum) * self.running_var + self.momentum * var if self.affine: x = x - self.running_mean x = x / torch.sqrt(self.running_var + self.eps) x = x * self.weight + self.bias else: x = x - self.running_mean x = x / torch.sqrt(self.running_var + self.eps) return x ``` 针对天气数据的四分类问题,我们可以使用BN层来对输入数据进行归一化。首先,我们可以将天气数据按照特定规则进行标准化,然后将标准化后的数据作为BN层的输入进行训练。 具体的操作流程如下:首先,我们通过分析天气数据的特征,选择合适的标准化方法,例如将温度、湿度等数值进行归一化处理。接着,我们定义一个基于PyTorch的四分类模型,可以使用卷积神经网络、全连接层等来构建。在模型的定义中,我们添加BN层,将标准化后的数据作为输入。 在训练过程中,我们对每个输入进行BN操作,将输入归一化后传递给模型进行训练。同时,我们根据训练数据的分布情况不断更新BN层中的running_mean和running_var参数,用于在测试阶段对输入进行归一化操作。 最后,我们使用合适的损失函数和优化器对模型进行训练,当模型收敛后,即可用于对新的天气数据进行四分类预测。 通过使用BN层对天气数据进行归一化,可以提高模型的收敛速度和性能稳定性,提高模型的泛化能力,从而更好地对天气数据进行分类预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值