Pytorch基础

PyTorch基础

pytorch

PyTorch是一个python库,它主要提供了两个高级功能:

  • GPU加速的张量计算

  • 构建在反向自动求导系统上的深度神经网络

数据类型

数据类型: torch.float32, torch.float64, torch.float16, torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64

创建Tensor方法:ones, zeros, eye, arange, linspace, rand, randn, normal, uniform, randperm

定义数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
x = torch.tensor(666)
# tensor(666)

x = torch.tensor([1,2,3,4,5,6])
# tensor([1,2,3,4,5,6])

x = torch.ones(2,3)
"""
tensor([[1., 1., 1.],
[1., 1., 1.]])
"""

x = torch.empty(5,3)
"""
tensor([[1.4178e-36, 0.0000e+00, 4.4842e-44],
[0.0000e+00, nan, 0.0000e+00],
[1.0979e-05, 4.2008e-05, 2.1296e+23],
[1.0386e+21, 4.4160e-05, 1.0742e-05],
[2.6963e+23, 4.2421e-08, 3.4548e-09]])
"""

x = torch.rand(5,3)
"""
tensor([[0.3077, 0.0347, 0.3033],
[0.9099, 0.2716, 0.4310],
[0.8286, 0.3317, 0.0536],
[0.9529, 0.4905, 0.1403],
[0.6899, 0.8349, 0.4015]])
"""

x = torch.zeros(5,3,dtype=torch.long)
"""
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
"""

# 基于现有的tensor,创建一个新tensor,
# 从而可以利用原有的tensor的dtype,device,size之类的属性信息
y = x.new_ones(5,3) #tensor new_* 方法,利用原来tensor的dtype,device

z = torch.randn_like(x, dtype=torch.float) # 利用原来的tensor的大小,但是重新定义了dtype

定义操作

凡是用Tensor进行各种运算的,都是Function

  • 基本运算,加减乘除,求幂求余
函数 功能
abs/sqrt/div/exp/fmod/log/pow 绝对值/平方根/除法/指数/求余/求幂
cos/sin/asin/atan2 ··· 三角函数
ceil/round/floor/trunc 上取整/四舍五入/下取整/只保留整数
clamp(input, min, max) 超过min和max截断
mean/sum/mode 均值/和/众数
norm/dist 范数/距离
std/var 标准差/方差
cumsum/cumprod 累加/累乘
  • 布尔运算,大于小于,最大最小
函数 功能
gt/lt/ge/le/eq/ne 大于/小于/大于等于/小于等于/等于/不等
topk 最大的k个数
sort 排序
max/min 比较两个tensor最大最小值
  • 线性运算,矩阵乘法,求模,求行列式
函数 功能
trace 对角线元素之和(矩阵的迹)
diag 对角线元素
triu/tril 矩阵的上三角/下三角,可指定偏移
mm/bmm 矩阵乘法,batch的矩阵乘法
addmm/addbmm/addmv/addr/badbmm 矩阵运算
t 转置
dot/cross 内积/外积
inverse 求逆矩阵
svd 奇异值分解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 创建一个 2x4 的tensor
m = torch.Tensor([[2, 5, 3, 7],
[4, 2, 1, 9]])

# 返回 m 中元素的数量
print(m.numel())

# 返回 第1列的全部元素
print(m[:, 1])

# 返回 第0行的全部元素
print(m[0, :])

# Create tensor of numbers from 1 to 5
# 注意这里结果是1到4,没有5
v = torch.arange(1, 5)
# tensor([1, 2, 3, 4])

# Scalar product 点积
m @ v
# tensor([49., 47.])

# Calculated by 1*2 + 2*5 + 3*3 + 4*7
m[[0], :] @ v
# tensor([49.])

# 转置,由 2x4 变为 4x2
print(m.t())
# 使用 transpose 也可以达到相同的效果
print(m.transpose(0, 1))
"""
tensor([[2., 4.],
[5., 2.],
[3., 1.],
[7., 9.]])
tensor([[2., 4.],
[5., 2.],
[3., 1.],
[7., 9.]])
"""

# returns a 1D tensor of steps equally spaced points between start=3, end=8 and steps=20
torch.linspace(3, 8, 20)
"""
tensor([3.0000, 3.2632, 3.5263, 3.7895, 4.0526, 4.3158, 4.5789, 4.8421, 5.1053,
5.3684, 5.6316, 5.8947, 6.1579, 6.4211, 6.6842, 6.9474, 7.2105, 7.4737,
7.7368, 8.0000])
"""

# 创建两个 1x4 的tensor
a = torch.Tensor([[1, 2, 3, 4]])
b = torch.Tensor([[5, 6, 7, 8]])

# 在 0 方向拼接 (即在 Y 方各上拼接), 会得到 2x4 的矩阵
print( torch.cat((a,b), 0))
"""
tensor([[1., 2., 3., 4.],
[5., 6., 7., 8.]])
"""

# 在 1 方向拼接 (即在 X 方各上拼接), 会得到 1x8 的矩阵
print( torch.cat((a,b), 1))
"""
tensor([[1., 2., 3., 4., 5., 6., 7., 8.]])
"""

张量

反向传播

PyTorch里并没有显式的Graph定义,计算步骤,存在Tensor的grad_fn里,沿着Tensor的grad_fn往后走,就是反向传播

计算图

对于上述过程,公式如下:

所以:

所以: