说明:本文内容全部是搬运的,仅仅是记录一下,更多详细内容可以参考pytorch教程。
Tensor中文翻译张量,是一个词不达意的名字。张量在不同学科中有不同的意义,在深度学习中张量表示的是一个多维数组,它是标量、向量、矩阵的拓展。标量是零维张量,向量是一维张量,矩阵是二维张量。
tensor之于pytorch等同于ndarray之于numpy,它是pytorch中最核心的数据结构,用于表达各类数据,如输入数据、模型的参数、模型的特征图、模型的输出等。
各类张量的api如下:可以参考官方文档。
tensor是一个类,这个类总共有八个主要属性,见下图:
data属性:多维数组。其他属性都是为其服务的。
dtype属性:多维数组的数据类型。
shape属性:多维数组的形状。
device属性:tensor所在的设备,cpu或者cuda。
grad属性:data对应的梯度,形状与data一致;
grad_fn属性:记录创建该Tensor时用到的Function,该Function在反向传播计算中使用,因此是自动求导的关键;
requires_grad属性:用来指示是否需要梯度。
is_leaf属性:用来指示是否是叶子结点,为叶子结点时,反向传播结束,其梯度仍会保存,非叶子结点的梯度被释放,以节省内存。
除了这8个主要属性之外,张量的属性还有很多,利用pycharm的debug功能可以进行查看。
因为张量是一个类,所以这个类定义了很多api,利用这些api接口,我们可以进行对张量进行创建和操作。(附:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科)
torch.tensor(data, dtype=None, device=None,
requires_grad=False, pin_memory=False)
通过numpy创建tensor方法是torch.from_numpy()。这里需要特别注意的是,创建的tensor和原array共享同一块内存,这也就意味着如果array里面的数值改变时,tensor中的数值也会改变。
import torch
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
t_from_numpy = torch.from_numpy(arr)
torch.zeros(*size, out=None, dtype=None,
layout=torch.strided, device=None, requires_grad=False)
功能:依给定的size创建一个全0的tensor,默认数据类型为torch.float32(也称为torch.float)。
主要参数:
import torch
output_tensor = torch.tensor([1])
t = torch.zeros((3, 3), out=output_tensor)
print(t, '\n', output_tensor)
print(id(t), id(output_tensor))
# 输出:
>>tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
4925603056 4925603056
torch.zeros_like(input, dtype=None, layout=None,
device=None, requires_grad=False)
功能:依input的size创建全0的tensor。
torch.ones(*size, out=None, dtype=None,
layout=torch.strided, device=None, requires_grad=False)
功能:依给定的size创建一个全1的tensor。
torch.ones_like(input, dtype=None, layout=None,
device=None, requires_grad=False)
功能:依input的size创建全1的tensor。
torch.full(size, fill_value, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:依给定的size创建一个值全为fill_value的tensor。
torch.full_like(input, fill_value, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)
torch.arange(start=0, end, step=1, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:创建等差的1维张量,长度为 (end-start)/step,需要注意数值区间为[start, end)。
torch.linspace(start, end, steps=100, out=None,
dtype=None, layout=torch.strided, device=None, requires_grad=False)
功能:创建均分的1维张量,长度为steps,区间为[start, end]。
torch.logspace(start, end, steps=100, base=10.0,
out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
主要参数:
备注:base (float) - 对数函数的底,默认值为10,此参数是在pytorch 1.0.1版本之后加入的。
torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided,
device=None, requires_grad=False)
功能:创建单位对角矩阵。
主要参数:
torch.empty(*size, out=None, dtype=None, layout=torch.strided,
device=None, requires_grad=False, pin_memory=False)
torch.empty_like(input, dtype=None, layout=None,
device=None, requires_grad=False)
功能:torch.empty_like之于torch.empty等同于torch.zeros_like之于torch.zeros,因此不再赘述。
torch.empty_strided(size, stride, dtype=None, layout=None, device=None, requires_grad=False, pin_memory=False)
功能:依size创建“空”张量,这里的“空”指的是不会进行初始化赋值操作。
主要参数:
torch.normal(mean, std, out=None)
功能:为每一个元素以给定的mean和std用高斯分布生成随机数
主要参数:
特别注意事项:
mean和std的取值分别有2种,共4种组合,不同组合产生的效果也不同,需要注意:
torch.rand(*size, out=None, dtype=None, layout=torch.strided,
device=None, requires_grad=False)
功能:在区间[0, 1)上,生成均匀分布。
主要参数:
torch.rand_like(input, dtype=None, layout=None,
device=None, requires_grad=False)
torch.randint(low=0, high, size, out=None, dtype=None,
layout=torch.strided, device=None, requires_grad=False)
功能:在区间[low, high)上,生成整数的均匀分布。
主要参数:
torch.randint_like(input, low=0, high, dtype=None, layout=torch.strided, device=None, requires_grad=False)
torch.randperm(n, out=None, dtype=torch.int64,
layout=torch.strided, device=None, requires_grad=False)
功能:生成从0到n-1的随机排列。perm == permutation
torch.bernoulli(input, *, generator=None, out=None)
功能:以input的值为概率,生成伯努力分布(0-1分布,两点分布)。
主要参数:
张量的操作与numpy类似。以后用到的时候在积累。
随机种子(random seed)是编程语言中基础的概念,大多数编程语言都有随机种子的概念,它主要用于实验的复现。针对随机种子pytorch也有一些设置函数。
以上均是设置cpu上的张量随机种子,在cuda上是另外一套随机种子。