如何在PyTorch中创建张量

164 阅读5分钟

如何在PyTorch中创建张量

在这篇文章中,我们将讨论所有深度学习工具包的基本构建模块--张量。

张量是所有DL工具箱的基本构建模块。这个名字听起来相当神秘,但其基本思想是,张量是一个多维数组。与学校数学进行类比,一个单一的数字就像一个点,是零维的,而矢量是一维的,就像一条线段,而矩阵是一个二维的物体。三维的数字集合可以用数字的平行四边形来表示,但它们并没有 像矩阵那样有一个单独的名字 。我们可以 为更高维度的集合保留 这个 术语 ,它们被命名为多维数组。

关于DL中使用的张量,需要注意的另一点是,它们与 张量微积分张量代数中使用的张量只有部分关系 。在DL中,张量是任何多维数组,但在数学中,张量是矢量空间之间的映射, 在某些情况下可能被表示为 多维数组,但它背后有更多的语义负载。数学家们通常会对那些用成熟的数学术语来命名不同事物的人皱眉头,所以,要注意了。

图1:从一个单一的数字到一个n维的张量

本文节选自深度强化学习的手On - 第二版作者:Maxim Lapan。本书是最新的RL工具和技术的畅销指南的更新和扩展版本。在这篇文章中,我们将讨论 所有DL工具箱的基本构件,张量。

张量的创建

如果你熟悉NumPy库,那么你已经知道它的中心目的是以通用方式处理多维数组。在NumPy中,这样的数组并不叫张量,但它们实际上就是张量。张量在科学计算中被非常广泛地用作数据的通用存储。例如,一个彩色图像可以被编码为一个三维张量,其尺寸为宽度、高度和颜色平面。

除了维度之外,张量的特征是其元素的类型。PyTorch支持八种类型:三种浮点数类型(16位、32位和64位)和五种整数类型(8位有符号、8位无符号、16位、32位和64位)。不同类型的张量由不同的类来表示,最常用的是 torch.FloatTensor (对应于一个32位的浮点数)。 torch.ByteTensor (一个8位无符号的整数), 和 torch.LongTensor (一个64位有符号的整数)。其余的可以在PyTorch文档中找到。

在PyTorch中,有三种方法来创建张量:

      • 通过调用所需类型的构造函数。
      • 通过将一个NumPy数组或Python列表转换为张量。在这种情况下,类型将取自数组的类型。
      • 通过要求PyTorch为你创建一个具有特定数据的张量。例如,你可以使用 torch.zeros() 函数来创建一个充满零值的张量。

为了给你提供这些方法的例子,让我们看一下一个简单的会话:

>>> import torch
>>> import numpy as np 
>>> a = torch.FloatTensor(3, 2) 
>>> a 
tensor([[4.1521e+09,  4.5796e-41],         
        [ 1.9949e-20, 3.0774e-41],         
        [ 4.4842e-44, 0.0000e+00]])

在这里,我们同时导入了PyTorch和NumPy,并创建了一个大小为3×2的未初始化的张量。默认情况下,PyTorch为张量分配了内存,但并没有用任何东西初始化它。为了清除张量的内容,我们需要使用其操作:

>> a.zero_()
tensor([[ 0., 0.],
        [ 0., 0.], 
        [ 0., 0.]])

张量有两种类型的操作: 原地 和功能操作。原地 操作在其名称后加一个下划线,并对张量的内容进行操作。在这之后,对象本身被返回。函数式等价物 在进行修改后 创建一个 张量 的副本 ,而原始张量不被触动。 从性能和内存的角度来看,原位 操作通常更有效率。

另一种通过构造函数创建张量的方法是提供一个 Python 迭代器 (例如,一个 list 或 tuple),它将被用作新创建的张量的内容:

>>> torch.FloatTensor([[1,2,3],[3,2,1]])
tensor([[ 1., 2., 3.],
        [ 3., 2., 1.]]) 

这里我们用NumPy创建同样的带零的张量:

>>> n = np.zeros(shape=(3, 2)) 
>>> n 
array([[ 0., 0.], 
       [ 0., 0.], 
       [ 0., 0.]]) 
>>> b = torch.tensor(n) 
>>> b 
tensor([[ 0., 0.], 
        [ 0., 0.],
        [ 0., 0.]], dtype=torch.float64) 

torch.tensor 方法接受NumPy数组作为参数,并从中创建一个适当形状的张量。在前面的例子中,我们创建了一个由0初始化的NumPy数组,它默认创建了一个双数(64位浮点)数组。所以,生成的张量具有 DoubleTensor 类型(在前面的例子中显示 为dtype 值)。通常,在DL中,双精度是不需要的,它增加了一个额外的内存和性能开销。通常的做法是使用32位浮点类型,甚至是16位浮点类型,这已经足够了。为了创建这样一个张量,你需要明确指定NumPy数组的类型:

>>> n = np.zeros(shape=(3, 2), dtype=np.float32) 
>>> torch.tensor(n) 
tensor([[ 0., 0.],         
        [ 0., 0.],         
        [ 0., 0.]]) 

作为一种选择,可以 在 dtype 参数 中向 torch.tensor 函数 提供所需张量的类型 。 但是要注意,因为这个参数希望得到的是PyTorch的类型说明,而不是NumPy的。例如,PyTorch类型保存在Torch包中。 torch.float32torch.uint8

>>> n = np.zeros(shape=(3,2)) 
>>> torch.tensor(n, dtype=torch.float32) 
tensor([[ 0., 0.], 
        [ 0., 0.], 
        [ 0., 0.]]) 

在这篇文章中,我们看到了张量的快速概述,张量是所有DL工具箱的基本构建模块。我们谈到了张量以及如何在 PyTorch 库中 创建它 。从理论和工程的角度发现提高RL方法效率的方法 。