Tensor张量
什么是Tensor
张量是一种特殊的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量对模型的输入和输出以及模型的参数进行编码。
张量相当于一个多维数组。
torch.Tensor(dtype, shape, device, data, requires_grad,
grad, grad_fn, is_leaf)
requires_grad:指示是否需要梯度
grad:data的梯度
grad_fn:创建Tensor的function
is_leaf:是否是叶子节点(张量)
Tensor的创建
1. 直接创建
张量可以直接从数据中创建。数据类型是自动推断的。
从data创建,可以是list,numpy。
torch.tensor(data,
dtype=None, # 默认与data一致
device=None, # cuda/cpu
requires_grad=False, # 是否需要梯度
pin_memory=False) # 是否存于锁页内存,通常为False
例如:
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)
2. 通过numpy创建
从numpy创建的tensor源于ndarray共享内存,当修改其中一个的数据,另一个也会被改动。
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
- 让tensor和numpy共享底层内存
t = torch.ones(5)
print(f"t: {
t}")
n = t.numpy()
print(f"n: {
n}") # n和t是一样的
t.add_(1)
print(f"t: {
t}")
print(f"n: {
n}") # t更改后,n的值依然跟t一样
3. 依据数值创建
- 依size创建全0张量
torch.zeros(*size, # 如(3,3)、(3,224,224)
out=None, # 输出的张量,将生成张量赋值给一个张量
dtype=None,
layout=torch.strided, # 内存中的布局形式,有strided、sparse_coo等
device=None,
requires_grad=False)
- 依input形状创建全0张量
torch.zeros_like(input,
dtype=None,
layout=None,
device=None,
requires_grad=False)
- 依size创建全1张量
torch.ones(*size,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
- 依input形状创建全1张量
torch.ones_like(input,
dtype=None,
layout=None,
device=None,
requires_grad=False)
- 依size创建全为fill_value的张量
torch.full(*size,
fill_value,
out=None,
dtype=None,
layout=torch.strided,
device=None,
requires_grad=False)
# 比如:
torch.full((3, 3), 10)
- 依input形状创建全为fill_value的张量
torch.ones_like(input,
fill_value,
dtype=None,
layout=None,
device=None,
requires_grad=False)
- 创建等值数列
torch.arange(start=0, # 区间为[start, end)
end,
step,
out=None,
dtype=None,
layout=None,
device=None,
requires_grad=False)
- 创建均分数列
torch.linspace(start, # 区间为[start, end]
end,
steps=100, # 数列长度,而不是步长,步长=(end-start)/(steps-1)
out=None,
dtype=None,
layout=None,
device=None,
requires_grad=False)
- 创建对数数列
torch.logspace(start,
end,
steps=100,
base=10.0,
out=None,
dtype=