注:本教程主要参考官方文档。
Tensors是一种和arrays和matrices非常相似的专门化数据结构。在PyTorch中,模型的输入、输出和参数都是使用Tensors数据类型。
Tensors和NumPy的ndarrays也相似,不同的是Tensors可以在GPUs或者硬件加速器上运行。通常,Tensors和Numpy向量可以共享相同的内存,不需要拷贝数据。Tensors are also optimized for automatic differentiation.
import torch
import numpy as np
Tensors的初始化方式有很多种
# 将list转为tensors
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)
# 将NumPy array转为tensors
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
# 注意:改变NumPy中的值,tensor的值也会变化。
# 将tensors转为numpy array
np_array = x_np.numpy()
# 注意:改变tensor中的值,NumPy array的值也会变化。
##1、list数据输入
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")
# 输出:
# Random Tensor:
# tensor([[0.5535, 0.4351, 0.6789],
# [0.5910, 0.4788, 0.3394]])
# Ones Tensor:
# tensor([[1., 1., 1.],
# [1., 1., 1.]])
# Zeros Tensor:
# tensor([[0., 0., 0.],
# [0., 0., 0.]])
Tensors的属性包括shape(形状)、datatype(数据类型)、device(设备)
tensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")
# 输出:
# Shape of tensor: torch.Size([3, 4])
# Datatype of tensor: torch.float32
# Device tensor is stored on: cpu
Tensors的操作非常多,包括数学运算、线性代数、矩阵操作(转置、索引、切片等)、采样等等,详细见这。
这些操作可以在GPU上运行。如果使用Colab分配一个GPU,通过:Runtime > Change runtime type > GPU
默认下,Tensors在CPU上被创建。如果要直接移动tensors到GPU,可以使用.to
方法(在保证GPU可用的情况下)。但需要注意,将大量tensors复制到其他设备(devices)需要花费大量时间和内存。
# 移动到GPU上,如果可用
if torch.cuda.is_available():
tensor = tensor.to("cuda")
下面是常用操作:
1、索引和切片
和numpy的索引和切片方式相同。
tensor = torch.ones(4, 4)
print(f"第一行: {tensor[0]}")
print(f"第一列: {tensor[:, 0]}")
print(f"最后一列: {tensor[..., -1]}")
tensor[:,1] = 0 # 索引
print(tensor)
2、连接
你可以使用torch.cat
沿给定维数连接tensors序列。也可以使用[torch.stack
](https://pytorch.org/docs/stable/generated/torch.stack.html),和torch.cat
有点不同。
# 沿着 维度1(水平方向) 连接三个tensor
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
# 输出:
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],
[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
3、数学运算
# 下面计算两个tensor的乘积。 y1, y2, y3 将会是相同的结果。
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)
y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)
# 下面计算元素对应相乘. z1, z2, z3 将会有相同的结果。
z1 = tensor * tensor
z2 = tensor.mul(tensor)
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)
单个元素的tensors,可以使用item()
将其转化为Python数值。
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))
# 12.0