敞开成长之旅!这是我参与「日新计划 12 月更文应战」的第3天,点击检查活动详情。

  • torch.Tensor
  • Tensor 数据类型
  • Tensor 的特点
    • view 和 reshape 的差异
  • Tensor 与 ndarray
  • 创立 Tensor
    • 传入维度的办法
  • 参阅资料

torch.Tensor

torch.Tensor 是一种包括单一数据类型元素的多维矩阵,类似于 numpy 的 array。 能够运用运用 torch.tensor() 办法将 python 的 list 或序列数据转换成 Tensor 数据,生成的是dtype 默认是 torch.FloatTensor

留意 torch.tensor() 总是复制 data。假如你有一个 tensor data 而且只是想改动它的 requires_grad 特点,可用 requires_grad_() 或许 detach() 来防止复制。假如你有一个 numpy 数组而且想防止复制,请运用 torch.as_tensor()

1,指定数据类型的 tensor 能够通过传递参数 torch.dtype 和/或许 torch.device 到结构函数生成:

留意为了改动已有的 tensor 的 torch.device 和/或许 torch.dtype, 考虑运用 to() 办法.

>>> torch.ones([2,3], dtype=torch.float64, device="cuda:0")
tensor([[1., 1., 1.],
        [1., 1., 1.]], device='cuda:0', dtype=torch.float64)
>>> torch.ones([2,3], dtype=torch.float32)
tensor([[1., 1., 1.],
        [1., 1., 1.]])

2,Tensor 的内容能够通过 Python 索引或许切片访问以及修正:

>>> matrix = torch.tensor([[2,3,4],[5,6,7]])
>>> print(matrix[1][2])
tensor(7)
>>> matrix[1][2] = 9
>>> print(matrix)
tensor([[2, 3, 4],
        [5, 6, 9]])

3,运用 torch.Tensor.item() 或许 int() 办法从只有一个值的 Tensor中获取 Python Number:

>>> x = torch.tensor([[4.5]])
>>> x
tensor([[4.5000]])
>>> x.item()
4.5
>>> int(x)
4

4,Tensor能够通过参数 requires_grad=True 创立, 这样 torch.autograd 会记载相关的运算实现主动求导:

>>> x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
>>> out = x.pow(2).sum()
>>> out.backward()
>>> x.grad
tensor([[ 2.0000, -2.0000],
 [ 2.0000,  2.0000]])

5,每一个 tensor都有一个相应的 torch.Storage 保存其数据。tensor 类供给了一个多维的、strided 视图, 并界说了数值操作。

Tensor 数据类型

Torch 界说了七种 CPU Tensor 类型和八种 GPU Tensor 类型:

Pytorch 基础-tensor 数据结构

torch.Tensor 是默认的 tensor 类型(torch.FloatTensor)的简称,即 32 位浮点数数据类型。

Tensor 的特点

Tensor 有许多特点,包括数据类型、Tensor 的维度、Tensor 的尺度。

  • 数据类型:可通过改动 torch.tensor() 办法的 dtype 参数值,来设定不同的 Tensor 数据类型。
  • 维度:不同类型的数据能够用不同维度(dimension)的张量来表示。标量为 0 维张量,向量为 1 维张量,矩阵为 2 维张量。彩色图像有 rgb 三个通道,能够表示为 3 维张量。视频还有时间维,能够表示为 4 维张量,有几个中括号 [ 维度便是几。可运用 dim() 办法 获取 tensor 的维度
  • 尺度:能够运用 shape特点或许 size()办法检查张量在每一维的长度,能够运用 view()办法或许reshape() 办法改动张量的尺度。Pytorch 框架中四维张量形状的界说是 (N, C, H, W)

关于如何了解 Pytorch 的 Tensor Shape 能够参阅 stackoverflow 上的这个 回答。

样例代码如下:

matrix = torch.tensor([[[1,2,3,4],[5,6,7,8]],
                       [[5,4,6,7], [5,6,8,9]]], dtype = torch.float64)
print(matrix)               # 打印 tensor
print(matrix.dtype)     # 打印 tensor 数据类型
print(matrix.dim())     # 打印 tensor 维度
print(matrix.size())     # 打印 tensor 尺度
print(matrix.shape)    # 打印 tensor 尺度
matrix2 = matrix.view(4, 2, 2) # 改动 tensor 尺度
print(matrix2)

程序输出结果如下:

Pytorch 基础-tensor 数据结构

view 和 reshape 的差异

  • 两个办法都是用来改动 tensor 的 shape,view() 只适合对满足连续性条件(contiguous)的 tensor 进行操作,而 reshape() 一起还能够对不满足连续性条件的 tensor 进行操作。
  • 在满足 tensor 连续性条件(contiguous)时,a.reshape() 回来的结果与a.view() 相同,都不会拓荒新内存空间;不满足 contiguous 时, 直接运用 view() 办法会失利,reshape() 仍然有用,可是会从头拓荒内存空间,不与之前的 tensor 共享内存,即回来的是 ”副本“(等价于先调用 contiguous() 办法再运用 view() 办法)。 更多了解参阅这篇文章

Tensor 与 ndarray

1,张量和 numpy 数组。能够用 .numpy() 办法从 Tensor 得到 numpy 数组,也能够用 torch.from_numpy 从 numpy 数组得到Tensor。这两种办法相关的 Tensor 和 numpy 数组是共享数据内存的。能够用张量的 clone办法复制张量,中断这种相关。

arr = np.random.rand(4,5)
print(type(arr))
tensor1 = torch.from_numpy(arr)
print(type(tensor1))
arr1 = tensor1.numpy()
print(type(arr1))
"""
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
<class 'numpy.ndarray'>
"""

2,item() 办法和 tolist() 办法能够将张量转换成 Python 数值和数值列表

# item办法和tolist办法能够将张量转换成Python数值和数值列表
scalar = torch.tensor(5)  # 标量
s = scalar.item()
print(s)
print(type(s))
tensor = torch.rand(3,2)  # 矩阵
t = tensor.tolist()
print(t)
print(type(t))
"""
1.0
<class 'float'>
[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]
<class 'list'>
"""

创立 Tensor

创立 tensor ,能够传入数据或许维度,torch.tensor() 办法只能传入数据,torch.Tensor() 办法既能够传入数据也能够传维度,强烈建议 tensor() 传数据,Tensor() 传维度,否则易搞混。

传入维度的办法

办法名 办法功能 备注
torch.rand(*sizes, out=None) → Tensor 回来一个张量,包括了从区间 [0, 1)均匀分布中抽取的一组随机数。张量的形状由参数sizes界说。 引荐
torch.randn(*sizes, out=None) → Tensor 回来一个张量,包括了从规范正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes界说。 不引荐
torch.normal(means, std, out=None) → Tensor 回来一个张量,包括了从指定均值 means 和规范差 std 的离散正态分布中抽取的一组随机数。规范差 std 是一个张量,包括每个输出元素相关的正态分布规范差。 多种形式,建议看源码
torch.rand_like(a) 根据数据 a 的 shape 来生成随机数据 不常用
torch.randint(low=0, high, size) 生成指定范围(low, hight)和 size 的随机整数数据 常用
torch.full([2, 2], 4) 生成给定维度,全部数据相等的数据 不常用
torch.arange(start=0, end, step=1, *, out=None) 生成指定距离的数据 易用常用
torch.ones(*size, *, out=None) 生成给定 size 且值全为1 的矩阵数据 简单
zeros()/zeros_like()/eye() 0 的 tensor 和 对角矩阵 简单

样例代码:

>>> torch.rand([1,1,3,3])
tensor([[[[0.3005, 0.6891, 0.4628],
          [0.4808, 0.8968, 0.5237],
          [0.4417, 0.2479, 0.0175]]]])
>>> torch.normal(2, 3, size=(1, 4))
tensor([[3.6851, 3.2853, 1.8538, 3.5181]])
>>> torch.full([2, 2], 4)
tensor([[4, 4],
        [4, 4]])
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

参阅资料

  • PyTorch:view() 与 reshape() 差异详解
  • torch.rand和torch.randn和torch.normal和linespace()