深度之眼 PyTorch 训练营第 4 期(1)- 张量的创建

本系列文章为“深度之眼” PyTorch 框架班学习笔记。

安装 PyTorch(macOS 操作系统下)

pip install torch

查询 PyTorch 版本

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)

上面可以看出,如果更改 numpytensor 中的任何一个数值,另一个也会有相应的改变,这说明两个变量是共享内存的。

创建张量

创建常数张量

  1. 创建全 0 张量
torch.zeros([2, 2]) # 全 0 张量
# tensor([[0., 0.],
#         [0., 0.]])
torch.zeros_like(b) # 根据已有张量的形状创建全 0 张量
# tensor([[0, 0, 0],
#         [0, 0, 0]])
  1. 创建全 1 张量
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]])
  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]])
  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])
  1. 创建对角张量
torch.eye(2)
# tensor([[1., 0.],
#         [0., 1.]])

以概率分布创建张量

  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)
  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)
  1. 连续型均匀分布
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) 上的连续型均匀分布张量
  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) 为界随机取整数的张量
  1. 随机打乱顺序
torch.randperm(10)
# tensor([7, 3, 0, 4, 8, 1, 2, 9, 5, 6])

欢迎关注我的微信公众号“花解语 NLP”:
深度之眼 PyTorch 训练营第 4 期(1)- 张量的创建_第1张图片

你可能感兴趣的:(PyTorch,Python,deep,learning)