现有网络模型的使用和修改、网络模型的保存和读取、完整的模型训练套路、使用GPU进行训练、完整的模型验证套路
算是学完了基础使用吧,但离实际操作还有很远。
代码的github仓库为:https://github.com/Eclipse-git725/pytorch
1. 现有网络模型的使用和修改
官方文档:https://pytorch.org/vision/stable/index.html
imgenet:https://pytorch.org/vision/0.9/datasets.html#imagenet
需要先安装scipy包,pip install scipy
pretrained为True时,模型是在数据集上已经训练好的
1 | import torch |
2. 网络模型的保存和读取
模型保存两种方式
1 | import torch |
模型读取两种方式(如果是自己定义的模型需要能访问到自己的模型结构才能加载)
1 | import torch |
3. 完整的模型训练套路
- 加载训练数据集和测试数据集
- 创建神经网络
- 创建损失函数
- 创建优化器
- 设置训练次数、测试次数和训练轮数
- 开始训练、测试,输出损失、准确率等,以及进行tensorboard可视化
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87from torch.utils.tensorboard import SummaryWriter
import torchvision
from torch.utils.data import DataLoader
from model.model import Model
from torch import nn
import torch
train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=torchvision.transforms.ToTensor(), download=True)
print("训练数据集的长度为:{}".format(len(train_set)))
print("测试数据集的长度为:{}".format(len(test_set)))
# 用DataLoader加载数据集
train_dataloader = DataLoader(train_set, batch_size=64, drop_last=True)
test_dataloader = DataLoader(test_set, batch_size=64, shuffle=True)
# 搭建神经网络
model = Model()
# 创建损失函数
loss_fn = nn.CrossEntropyLoss()
# 创建优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 设置训练网络的参数
# 记录训练次数
total_train_step = 0
# 记录测试次数
total_test_step = 0
# 记录训练轮数
epoch = 5
# 添加tensorboard
writer = SummaryWriter("logs")
for i in range(epoch):
print("-----------第{}轮训练开始---------".format(i+1))
# 训练步骤开始
# 对特殊的层有影响,比如dropout和batchnorm
model.trian()
for data in train_dataloader:
imgs, target = data
output = model(imgs)
loss = loss_fn(output, target)
# 优化器优化模型
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_train_step += 1
if(total_train_step % 100 == 0):
print("训练次数:{},loss:{}".format(total_train_step, loss))
writer.add_scalar("train_loss", loss.item(), total_train_step)
# 测试步骤开始
# 对特殊的层有影响,比如dropout和batchnorm
model.eval()
total_test_loss = 0
# 分类中的重要参数,正确率
total_accuracy = 0
with torch.no_grad():
for data in test_dataloader:
imgs, target = data
output = model(imgs)
loss = loss_fn(output, target)
total_test_loss += loss
# 计算正确率
accuracy = (output.argmax(1) == target).sum()
total_accuracy += accuracy
print("整体测试集上的loss为:{}".format(total_test_loss))
print("整体测试集上的正确率为:{}".format(total_accuracy/len(test_set)))
writer.add_scalar("test_loss", total_test_loss, total_test_step)
writer.add_scalar("test_accuracy", total_accuracy/len(test_set), total_test_step)
total_test_step += 1
# 保存每一轮训练的模型
torch.save(model, "model/model_{}.pth".format(i))
print("模型已保存")
writer.close()
4. 使用GPU进行训练
只有模型、数据、损失函数可以调用.cuda()函数
示例:
1 | if torch.cuda.is_available(): |
如果电脑没有GPU,可以使用google colab使用GPU训练,有免费额度。
使用手机Google可以不用开梯子,不用手机号,就注册上一个google邮箱。
设置使用GPU,可想jupyter一样使用。
5. 完整的模型验证套路
利用已经训练好的模型,给它提供输入
若是拿GPU训练好的模型,在CPU上验证,在模型load时使用:model = torch.load("./model/model_4.pth", map_location=torch.device('cpu'))
1 | from PIL import Image |