Pytorch快速入门

1. Pytorch 简介

  • 一种使用 Python 的机器学习框架。
  • 两个主要特性:
    • 支持GPUs上加速的多维张量(Tensor)运算。
    • 训练神经网络时自动计算梯度。

2. 回顾机器学习的简单流程

训练

  • 定义网络
  • 指定损失函数
  • 选择损失函数优化器
  • 训练过程

image

验证

训练的同时验证各个阶段的训练效果, 进行及时的调整。

测试

对训练完成的网络进行实际使用, 测试网络的泛化能力。

image

3. 结合Pytorch

3.1 读取数据

image

可用的API(Dataset & Dataloader)

  • Dataset
    存储数据样本和其相应的标签。
  • Dataloader
    以 batch 为形式读取的数据样本组, 支持多进程读取。

使用介绍

  • 使用时一般需要去构建自己的 Dataset 的具体实现。
from torch.utils.data import Dataset, DataLoader

class MyDataset(Dataset):
	# 1. 读取数据和预处理的方式
	def __init__(self, file):
		self.data = ...
	# 2. 获取单个样本的方法
	def __getitem__(self, index):
		return self.data[index]
	# 3. 获取样本大小的方法
	def __len__(self):
		return len(self.data)
  • 定义后配合 DataLoader 使用。
dataset = MyDataset(file)
# shuffle 训练集可以设为True, 表示随机取一个batch, 测试集一般设为Flase。
dataloader = DataLoader(dataset, batch_size, shuffle=True) 

image

存储形式(张量 Tensor)

  • 简单理解
    Tensor 是一种高维度的矩阵。

image

  • Tensor 的形状
    可以通过 .shape 属性获取。

  • 创建 Tensor

# 1. 直接利用数据创建(列表list 或 numpy 的数组 array)
x = torch.tensor([[1, -1], [-1, 1]])
x = torch.from_numpy(np.array[[1, 1], [-1, 1]])
# 2. 常量 1 或 0
x = torch.zeros([2, 2]) # 括号里填要创建的形状 shape
x = torch.ones([1, 2, 5])

image
image
image

  • 常用操作

    • 简单算术运算
      image
    • 矩阵转置
      image
    • 矩阵收缩
      image
    • 矩阵扩张
      image
    • 矩阵连接
      image
  • 数据类型

image

  • 训练设备设置

image

  • 梯度计算
x = torch.tensor([[1., 0.], [-1., 1.]], requires_grad=True)
z = x.pow(2).sum()
z.backward()
print(x.grad)

image
image

3.2 定义网络

image

可用的API(torch.nn)

  • 网络层的简单举例: 线性层

image
image

  • 激活函数

image

使用介绍

  • 需要自己构建自己的网络时的大致操作。
from torch.nn as nn

# 方式1
class MyModel(nn.Module):
	# 1. 定义网络结构
	def __init__(self):
		super(MyModel, self).__init__()
		self.net = nn.Sequential(
			nn.Linear(10, 32),
			nn.Sigmoid(),
			nn.Linear(32, 1)
		)
	# 2. 网络前向计算
	def forward(self, x):
		return self.net(x)

# 方式2
class MyModel(nn.Module):
	# 1. 定义网络结构
	def __init__(self):
		super(MyModel, self).__init__()
		self.layer1 = nn.Linear(10, 32)
		self.layer2 = nn.Sigmoid()
		self.layer3 = nn.Linear(32, 1)

	# 2. 网络前向计算
	def forward(self, x):
		out = self.layer1(x)
		out = self.layer2(out)
		out = self.layer3(out)
		return out

3.3 指定损失函数

image

可用的API(torch.nn)

  • MSE(Mean Squared Error)
    回归任务
    criterion = nn.MSELoss()
  • Cross Entropy
    分类任务
    criterion = nn.CrossEntropyLoss()

使用介绍

loss = criterion(model_ouput, expected_value)

3.4 选择优化器

image

可用的API(torch.optim)

  • 总的来说就是各种梯度下降法的变式。
    如 SGD(Stochastic Gradinet Descent) 随机梯度下降
    optimizer = torch.optim.SGD(model.parameters(), lr, momentum = 0)

使用介绍

  • 对每个 batch:
    • optimizer.zero_grad() 每个 batch 要重新计算, 重置梯度
    • loss.backward() 计算此 batch 的梯度, 进行反向传播
    • optimizer.step() 根据梯度, 更新参数

3.5 总体 -> 训练、验证与测试

image

# ==================== 准备流程 ===================
# 读取数据
dataset = MyDataset(file)
# 加载数据
tr_set = DataLoader(dataset, batch_size=16, shuffle=True)
dv_set = DataLoader(dataset, batch_size=16, shuffle=False)
# 构建模型, 转入可用设备
model = MyModel().to(device)
# 设置损失函数
criterion = nn.MSELoss()
# 设置优化器
optimizer = torch.optim.SGD(model.parameters(), monentum = 0.1)

# =================== 训练流程 train loop ===================
# 设定循环次数 epoch
for epoch in range(n_epochs):
	# 设置为训练模式
	model.train()
	# 读取 batch
	for x, y in tr_set:
		# 重置梯度
		optimizer.zero_grad()
		# 转移数据至可用设备
		x, y = x.to(device), y.to(device)
		# 模型前向传播
		pred = model(x)
		# 计算损失
		loss = criterion(pred, y)
		# 模型反向传播
		loss.backward()
		# 更新参数
		optimizer.step()

# =================== 验证流程 validation loop ===================
# 设置为验证模式
model.eval()
total_loss = 0
# 读取 batch
for x, y in dv_set:
	# 转移数据至可用设备
	x, y = x.to(device), y.to(device)
	# 验证不用计算梯度
	with torch.no_grad():
		# 模型前向传播
		pred = model(x)
		# 计算损失
		loss = criterion(pred, y)
	# batch 的总体损失
	total_loss += loss.cpu().item() * len(x)
	# 计算平均损失
	avg_loss = total_loss / len(dv_set.dataset)

# =================== 测试流程 testing loop ===================
# 设置为验证模式
model.eval()
# 存放预测结果
preds = []
# 读取 batch
for x in tt_set:
	# 转移数据至可用设备
	x = x.to(device)
	# 测试不用计算梯度
	with torch.no_grad():
		# 模型前向传播
		pred = model(x)
		# 保存结果
		preds.append(pred.cpu())
  • 这里用到了 model 的模式设置 和 计算梯度设置

image

3.5 保存/加载模型

  • Save
    • 只保存模型参数字典(推荐)
      torch.save(model.state_dict(), path)
    • 保存整个模型
      torch.save(model, path)
  • Load
    • 读取模型参数字典
      ckpt = torch.load(path)
      model.load_state_dict(ckpt)
    • 读取整个模型
      model = torch.load(path)

3. 其他关于 Pytorch 的 API

image

posted @ 2022-10-06 19:27  bok_tech  阅读(145)  评论(1)    收藏  举报