本系列文章为“深度之眼” PyTorch 框架班学习笔记。
pip install torch
import torch
print(torch.__version__)
# 1.5.0
张量是一个多维数组:
- 标量是一个 0 维数组;
- 向量是一个 1 维数组;
- 矩阵是一个 2 维张量。
torch.tensor
有什么功能?最重要的功能是可以求导:
- data
:被转换为 tensor 的数据;
- grad
:数据的梯度;
- grad_fn
:求导的方式;
- requires_grad
:是否要记录梯度;
- is_leaf
:是否为叶子节点;
- dtype
:数据类型;
- shape
:张量的形状;
- device
:该张量所在的设备。
numpy
创建张量a = np.array([[1., 2., 3.], [4., 5., 6.]])
print(a)
# array([[1., 2., 3.],
# [4., 5., 6.]])
b = torch.from_numpy(a)
print(b)
# tensor([[1., 2., 3.],
# [4., 5., 6.]], dtype=torch.float64)
b[0][0] = -1 # 改变张量的数值
print(a)
# [[-1. 2. 3.]
# [ 4. 5. 6.]]
print(b)
# tensor([[-1., 2., 3.],
# [ 4., 5., 6.]], dtype=torch.float64)
a[1][0] = 99.
print(a) # 改变数组的数值
# [[-1. 2. 3.]
# [99. 5. 6.]]
print(b)
# tensor([[-1., 2., 3.],
# [99., 5., 6.]], dtype=torch.float64)
上面可以看出,如果更改 numpy
或 tensor
中的任何一个数值,另一个也会有相应的改变,这说明两个变量是共享内存的。
torch.zeros([2, 2]) # 全 0 张量
# tensor([[0., 0.],
# [0., 0.]])
torch.zeros_like(b) # 根据已有张量的形状创建全 0 张量
# tensor([[0, 0, 0],
# [0, 0, 0]])
torch.ones((3, 3)) # 全 1 张量
# tensor([[1., 1., 1.],
# [1., 1., 1.],
# [1., 1., 1.]])
torch.ones_like(b) # 根据已有张量的形状创建全 1 张量
# tensor([[1, 1, 1],
# [1, 1, 1]])
torch.full((3, 3), 1) # 以一个常数填充给定尺寸的张量
# tensor([[1., 1., 1.],
# [1., 1., 1.],
# [1., 1., 1.]])
torch.full_like(b, 1) # 根据已有张量的形状,以一个常数填充给定尺寸的张量
# tensor([[1, 1, 1],
# [1, 1, 1]])
torch.arange(2, 10, 2) # 以 [start, end) 为范围,以 step 为步长创建
# tensor([2, 4, 6, 8])
torch.linspace(1, 10, 10) # 以 [start, end] 为范围,以 step 为步数创建
tensor([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
torch.logspace(0, 1, 10, 2) # 以 [start, end] 为范围,以 step 为步数,以 base 为底创建
tensor([1.0000, 1.0801, 1.1665, 1.2599, 1.3608, 1.4697, 1.5874, 1.7145, 1.8517, 2.0000])
torch.eye(2)
# tensor([[1., 0.],
# [0., 1.]])
torch.normal(0, 1, (4,)) # 以 mean,std 全部为标量,需要额外提供一个 size
# tensor([-0.3358, -1.1152, 0.2535, 2.8055])
torch.normal(torch.tensor([1, 2, 3, 4], dtype=torch.float32), torch.tensor([1, 2, 3, 4], dtype=torch.float32)) # mean 和 std 至少一个是张量
# torch.normal(torch.tensor([1, 2, 3, 4], dtype=torch.float32), 1)
torch.randn((3, 3)) # 以 mean=0,std=1 创建正态分布的张量
# tensor([[-1.1277, -1.3969, 0.1839],
# [ 0.1146, 0.4188, -1.3103],
# [ 1.2729, -1.1919, 1.6619]])
torch.randn_like(b) # 根据已有张量的形状,创建一个满足标准正态分布的张量
# tensor([[-0.7947, -0.0604, 0.6871],
# [-0.9064, -0.7432, 0.3624]], dtype=torch.float64)
torch.rand((3, 3)) # 创建一个在 [0, 1) 上的连续型均匀分布张量
# tensor([[0.4681, 0.6663, 0.0803],
# [0.9212, 0.9536, 0.2601],
# [0.6857, 0.1096, 0.6221]])
torch.rand_like(b) # 根据已有张量的形状,创建一个在 [0, 1) 上的连续型均匀分布张量
torch.randint(1, 5, (3, 3)) # 以 [low, high) 为界随机取整数的张量
# tensor([[2, 4, 1],
# [4, 3, 1],
# [4, 3, 3]])
torch.randint_like(b, 1, 5) # 根据已有张量的形状,创建一个在 [low, high) 为界随机取整数的张量
torch.randperm(10)
# tensor([7, 3, 0, 4, 8, 1, 2, 9, 5, 6])