人工智能学习 11 - PyTorch

安装: https://pytorch.org/get-started/locally/

选择 系统, 安装方法, 语言: Python, 计算平台 之后就出现对应的安装命令了.

1
2
3
import torch

torch.cuda.is_available()

基本用法

数据初始化

1
2
3
4
5
6
7
8
9
10
11
12
# 使用其他数据类型创建
torch.tensor(array)
torch.from_numpy(ndarray)

# 指定填充
torch.ones(size) .ones_like(ts)
torch.zeros(size) .zeros_like(ts)
torch.empty(size) .empty_like(ts)

# 随机填充
torch.rand(size) .rand_like(ts)
torch.randn(size) .randn_like(ts) # 符合正态分布随机

数据类型转换

1
2
3
4
5
6
# tensor 类型数据转换
ts.numpy()

# tensor item 数据类型转换
it.data # tensor 类型
it.data.item() 或 it.item() # python 类型

tensor 数据属性

1
2
3
ts.shape 或 ts.size() # tensor 形状
ts.dtype # 数据类型
ts.device # 数据存储位置
1
2
3
# tensor 形状转换
ts.view(4, 3) 或 ts.view(-1, 3) # -1 表示自己推算
ts.transpose(1, 0) 或 ts.T

将数据存储到 cuda 进行运算

1
2
3
4
print(f"tensor store device {tensor.device}")
if torch.cuda.is_avaliable():
tensor = tensor.to("cuda")
print(f"tensor store device {tensor.device}")

基本运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 以 _ 结尾的函数 表示 inplace

# + - * / += -= *= /=
# add sub mul matmul div
torch.add(a, b)
torch.add(a, b, out=result)
a.add(b)
a.add_(b)

# 切片
ts[:,1]

# 链接
ts = torch.cat([ts0,ts1], dim=0)

# element-wise product 点乘 (对应位置相乘)
ts1 * ts0
ts1.mul(ts0)

# matrix multiplication 矩阵乘法
ts1 @ ts0
ts1.matmul(ts0.T)

向量乘法:

  • 数乘: 标量 × 向量, 标量与向量中每个位置相乘, 结果是向量
  • 点乘(内积): 对应位置相乘之后求和, 结果是标量
  • 叉乘(外积,叉积,向量积): 与两个向量组成的平面垂直的向量

矩阵乘法:

  • 数乘:
  • 矩阵乘法: (mv)·(vn)=(mn) 前矩阵每个行 与 后矩阵每个列 对应位置相乘后求和, 得到的和组成的新矩阵
  • 矩阵点乘(element-wise product, entry-wise product, 哈达玛积 hadamard product): (mn)☉(mn)=(mn) 对应位置相乘
  • 克罗内克积(kronecker product): 前矩阵的每个元素 与 后矩阵整体 进行数乘, 得到的矩阵拼接成的新矩阵

参考: https://www.jianshu.com/p/9165e3264ced

反向传播 与 自动微分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
x = torch.tensor(1.)
w = torch.tensor(2., requires_grad=True) # 声明设置, 该 tensor 可追溯梯度过程
w.require_grad_(True) # 后期设置
b = torch.tensor(3.)

y = w*x + b

y.backward() # 自动反向传播, 计算梯度
print(y)
print(y.grad_fn)
print(w.grad) # 自动保存的梯度

with torch.no_grad():
# 这里定义的变量的逻辑都不进行跟踪记录, 不保存 grad 梯度
# 这里使用的外部定义的变量, 仍然记录梯度不受影响
  1. 使用 requires_grad=True 将会追踪该 tensor 的所有操作
  2. 完成计算后, 通过 .backward() 自动计算所有 grad 梯度
  3. 自动计算后, 梯度会保存在该变量的 .grad 属性上
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.