Pytorch快速入门
1. Pytorch 简介
- 一种使用 Python 的机器学习框架。
- 两个主要特性:
- 支持GPUs上加速的多维张量(Tensor)运算。
- 训练神经网络时自动计算梯度。
2. 回顾机器学习的简单流程
训练
- 定义网络
- 指定损失函数
- 选择损失函数优化器
- 训练过程

验证
训练的同时验证各个阶段的训练效果, 进行及时的调整。
测试
对训练完成的网络进行实际使用, 测试网络的泛化能力。

3. 结合Pytorch
3.1 读取数据

可用的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)

存储形式(张量 Tensor)
- 简单理解
Tensor 是一种高维度的矩阵。

-
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])



-
常用操作
- 简单算术运算

- 矩阵转置

- 矩阵收缩

- 矩阵扩张

- 矩阵连接

- 简单算术运算
-
数据类型

- 训练设备设置

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


3.2 定义网络

可用的API(torch.nn)
- 网络层的简单举例: 线性层


- 激活函数

使用介绍
- 需要自己构建自己的网络时的大致操作。
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 指定损失函数

可用的API(torch.nn)
- MSE(Mean Squared Error)
回归任务
criterion = nn.MSELoss() - Cross Entropy
分类任务
criterion = nn.CrossEntropyLoss()
使用介绍
loss = criterion(model_ouput, expected_value)
3.4 选择优化器

可用的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 总体 -> 训练、验证与测试

# ==================== 准备流程 ===================
# 读取数据
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 的模式设置 和 计算梯度设置

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


浙公网安备 33010602011771号