1.2 Tensor(张量)介绍
本章代码:
Tensor 的概念
Tensor 中文为张量。张量的意思是一个多维数组,它是标量、向量、矩阵的高维扩展。
标量可以称为 0 维张量,向量可以称为 1 维张量,矩阵可以称为 2 维张量,RGB 图像可以表示 3 维张量。你可以把张量看作多维数组。
Tensor 与 Variable
在 PyTorch 0.4.0 之前,torch.autograd 包中存在 Variable 这种数据类型,主要是用于封装 Tensor,进行自动求导。Variable 主要包含下面几种属性。
data: 被包装的 Tensor。
grad: data 的梯度。
grad_fn: 创建 Tensor 所使用的 Function,是自动求导的关键,因为根据所记录的函数才能计算出导数。
requires_grad: 指示是否需要梯度,并不是所有的张量都需要计算梯度。
is_leaf: 指示是否叶子节点(张量),叶子节点的概念在计算图中会用到,后面详细介绍。
dtype: 张量的数据类型,如 torch.FloatTensor,torch.cuda.FloatTensor。
shape: 张量的形状。如 (64, 3, 224, 224)
device: 张量所在设备 (CPU/GPU),GPU 是加速计算的关键
Tensor 创建的方法
直接创建 Tensor
torch.tensor()
data: 数据,可以是 list,numpy
dtype: 数据类型,默认与 data 的一致
device: 所在设备,cuda/cpu
requires_grad: 是否需要梯度
pin_memory: 是否存于锁页内存
代码示例:
输出为:
torch.from_numpy(ndarray)
从 numpy 创建 tensor。利用这个方法创建的 tensor 和原来的 ndarray 共享内存,当修改其中一个数据,另外一个也会被改动。
输出为:
根据数值创建 Tensor
torch.zeros()
功能:根据 size 创建全 0 张量
size: 张量的形状
out: 输出的张量,如果指定了 out,那么
torch.zeros()
返回的张量和 out 指向的是同一个地址layout: 内存中布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。
device: 所在设备,cuda/cpu
requires_grad: 是否需要梯度
代码示例:
输出是:
torch.zeros_like
功能:根据 input 形状创建全 0 张量
input: 创建与 input 同形状的全 0 张量
dtype: 数据类型
layout: 内存中布局形式,有 strided,sparse_coo 等。当是稀疏矩阵时,设置为 sparse_coo 可以减少内存占用。
同理还有全 1 张量的创建方法:torch.ones()
,torch.ones_like()
。
torch.full(),torch.full_like()
功能:创建自定义数值的张量
size: 张量的形状,如 (3,3)
fill_value: 张量中每一个元素的值
代码示例:
输出为:
torch.arange()
功能:创建等差的 1 维张量。注意区间为[start, end)。
start: 数列起始值
end: 数列结束值,开区间,取不到结束值
step: 数列公差,默认为 1
代码示例:
输出为:
torch.linspace()
功能:创建均分的 1 维张量。数值区间为 [start, end]
start: 数列起始值
end: 数列结束值
steps: 数列长度 (元素个数)
代码示例:
输出为:
torch.logspace()
功能:创建对数均分的 1 维张量。数值区间为 [start, end],底为 base。
start: 数列起始值
end: 数列结束值
steps: 数列长度 (元素个数)
base: 对数函数的底,默认为 10
代码示例:
输出为:
torch.eye()
功能:创建单位对角矩阵( 2 维张量),默认为方阵
n: 矩阵行数。通常只设置 n,为方阵。
m: 矩阵列数
根据概率创建 Tensor
torch.normal()
功能:生成正态分布 (高斯分布)
mean: 均值
std: 标准差
有 4 种模式:
mean 为标量,std 为标量。这时需要设置 size。
代码示例:
输出为:
mean 为标量,std 为张量
mean 为张量,std 为标量
代码示例:
输出为:
这 4 个数采样分布的均值不同,但是方差都是 1。
mean 为张量,std 为张量
代码示例:
输出为:
其中 1.6614 是从正态分布 $N(1,1)$ 中采样得到的,其他数字以此类推。
torch.randn() 和 torch.randn_like()
功能:生成标准正态分布。
size: 张量的形状
torch.rand() 和 torch.rand_like()
功能:在区间 [0, 1) 上生成均匀分布。
torch.randint() 和 torch.randint_like()
功能:在区间 [low, high) 上生成整数均匀分布。
size: 张量的形状
torch.randperm()
功能:生成从 0 到 n-1 的随机排列。常用于生成索引。
n: 张量的长度
torch.bernoulli()
功能:以 input 为概率,生成伯努利分布 (0-1 分布,两点分布)
input: 概率值
参考资料
如果你觉得这篇文章对你有帮助,不妨点个赞,让我有更多动力写出好文章。
我的文章会首发在公众号上,欢迎扫码关注我的公众号张贤同学。
最后更新于