# PyTorch学习笔记(15)--神经网络模型训练实战

PyTorch学习笔记(15)–神经网络模型训练实战

    本博文是PyTorch的学习笔记,第15次内容记录,主要是以一个实际的例子来分享神经网络模型的训练和测试的完整过程。

1.神经网络模型训练实践

1.1神经网络训练一般步骤

    经过前几面14次的知识介绍,现将神经网络模型训练的一般步骤总结如下:

 1. 根据需要搭建神经网络模型,创建相应的class类,并将模型保存为model.py文件;
 2. 创建train.py文件,在train.py文件中执行下述第3-21步操作;
 3. 创建训练数据集和测试数据集:train_data、test_data;
 4. 分别求解训练数据集和测试数据集的长度:train_data_size	、test_data_size;
 5. 利用DataLoader加载训练数据集和测试数据集:train_dataloader、test_dataloader,同时设置batch_size;
 6. 创建网络模型类的实例test;
 7. 选择损失函数loss_fn;
 8. 选择优化器optimizer,设置学习率learning_rate;
 9. 记录训练的次数和测试的次数:total_train_step、total_test_step;
 10. 记录训练的轮次:epoch;
 11. 用循环开始一次epoch,每次epoch执行下列12-16步的训练步骤、17-20步的测试步骤、21步的模型保存;
 12. 开始训练步骤:循环读取训练数据集train_dataloader中的每一个数据;
 13. 调用test实例计算实际值;
 14. 调用损失函数loss_fn计算实际值与目标值之间的差距,也就是损失值loss;
 15. 用优化器优化模型:清零上一轮的梯度值zero_grad()、执行反向传播backward()、执行优化step();
 16. 输出每一轮数据计算的损失值;
 17. 开始测试步骤:循环读取测试数据集test_dataloader中的每一个数据;
 18. 调用test实例计算实际值;
 19. 调用损失函数loss_fn计算实际值与目标值之间的差距,也就是损失值loss;
 20. 输出每一轮数据计算的损失值;
 21. 调用torch.save()保存每一轮epoch的训练模型。

1.2神经网络训练代码

    现创建模型文件:model.py,在该文件中搭建下列神经网络;
在这里插入图片描述

# coding :UTF-8
# 文件功能: 代码实现模型定义功能
# 开发人员: dpp
# 开发时间: 2021/8/19 11:31 上午
# 文件名称: model.py
# 开发工具: PyCharm

import torch
from torch import nn

# 搭载神经网络
class Test(nn.Module):
    def __init__(self):
        super(Test, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=32, kernel_size=5, stride=1, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=32, kernel_size=5, stride=1, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=5, stride=1, padding=2),
            nn.MaxPool2d(kernel_size=2),
            nn.Flatten(),
            nn.Linear(in_features=64*4*4, out_features=64),
            nn.Linear(in_features=64, out_features=10)
        )

    def forward(self, x):
        x = self.model(x)
        return x

    创建模型训练文件train.py,在该文件中实现模型的训练、模型的测试、模型的保存,代码如下:

# coding :UTF-8
# 文件功能: 代码实现模型训练功能
# 开发人员: dpp
# 开发时间: 2021/8/19 11:16 上午
# 文件名称: train.py
# 开发工具: PyCharm

import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

from model import *

train_data = torchvision.datasets.CIFAR10(root="CIFAR10", train=True,
                                          transform=torchvision.transforms.ToTensor(),
                                          download=True)
test_data = torchvision.datasets.CIFAR10(root="CIFAR10", train=False,
                                         transform=torchvision.transforms.ToTensor(),
                                         download=True)

# len表示求解数据集的长度
train_data_size = len(train_data)
test_data_size = len(test_data)
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))

# 利用dataloader加载数据集
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)

# 创建网络模型
test = Test()

# 损失函数
loss_fn = nn.CrossEntropyLoss()

# 优化器
learning_rate = 1e-2
optimizer = torch.optim.SGD(test.parameters(), lr=learning_rate)

# 设置训练网络的一些参数
# 记录训练的次数
total_train_step = 0
# 记录测试的次数
total_test_step = 0
# 记录训练的轮数
epoch = 10

# 添加Tensorboard
writer = SummaryWriter("logs")

for i in range(epoch):
    print("------第{}轮训练开始------".format(i))

    # 训练步骤开始
    for data in train_dataloader:
        imgs, targets = data
        outputs = test(imgs)
        loss = loss_fn(outputs, targets)

        # 优化器优化模型
        optimizer.zero_grad()   # 将上一轮的梯度清零
        loss.backward()   # 借助梯度进行反向传播
        optimizer.step()

        total_train_step = total_train_step + 1
        if total_train_step % 100 == 0:
            print("训练次数:{}, loss: {}".format(total_train_step, loss.item()))
            writer.add_scalar("train_loss", loss.item(), total_train_step)

    # 测试步骤开始
    total_test_loss = 0
    with torch.no_grad():
        for data in test_dataloader:
            imgs, targets = data
            outputs = test(imgs)
            loss = loss_fn(outputs, targets)
            total_test_loss = total_test_loss + loss.item()
    print("整体测试集上的loss: {}".format(total_test_loss))
    writer.add_scalar("test_loss", total_test_loss, total_test_step)
    total_test_step = total_test_step + 1

    torch.save(test, "test_{}.pth".format(i))
    print("模型已保存")

writer.close()

    上述代码中增加了tensorboard的部分,方便在tensorboard中直接查看损失值的变化情况。

1.3神经网络训练结果

    (1)在PyCharm中直接查看输出的损失值,每100次计算输出1次损失值,结果如下:

训练数据集的长度为:50000
测试数据集的长度为:10000
------第0轮训练开始------
训练次数:100, loss: 2.292705535888672
训练次数:200, loss: 2.295078992843628
训练次数:300, loss: 2.2829833030700684
训练次数:400, loss: 2.252350330352783
训练次数:500, loss: 2.1948461532592773
训练次数:600, loss: 2.067460060119629
训练次数:700, loss: 2.0181784629821777
整体测试集上的loss: 317.5153886079788
模型已保存
------第1轮训练开始------
训练次数:800, loss: 1.92983078956604
训练次数:900, loss: 1.8786777257919312
训练次数:1000, loss: 1.9706447124481201
训练次数:1100, loss: 1.9890754222869873
训练次数:1200, loss: 1.7416054010391235
训练次数:1300, loss: 1.7033307552337646
训练次数:1400, loss: 1.7686882019042969
训练次数:1500, loss: 1.8525246381759644
整体测试集上的loss: 322.9014937877655
模型已保存
------第2轮训练开始------
训练次数:1600, loss: 1.804147481918335
训练次数:1700, loss: 1.6655009984970093
训练次数:1800, loss: 1.9468008279800415
训练次数:1900, loss: 1.7184741497039795
训练次数:2000, loss: 1.9555106163024902
训练次数:2100, loss: 1.5428732633590698
训练次数:2200, loss: 1.4810236692428589
训练次数:2300, loss: 1.8231137990951538
整体测试集上的loss: 279.0886740684509
模型已保存
------第3轮训练开始------
训练次数:2400, loss: 1.7259573936462402
训练次数:2500, loss: 1.38010835647583
训练次数:2600, loss: 1.5945594310760498
训练次数:2700, loss: 1.6825271844863892
训练次数:2800, loss: 1.5124503374099731
训练次数:2900, loss: 1.6205559968948364
训练次数:3000, loss: 1.3781572580337524
训练次数:3100, loss: 1.5413490533828735
整体测试集上的loss: 265.67453396320343
模型已保存
------第4轮训练开始------
训练次数:3200, loss: 1.4236302375793457
训练次数:3300, loss: 1.5075007677078247
训练次数:3400, loss: 1.5356706380844116
训练次数:3500, loss: 1.5958044528961182
训练次数:3600, loss: 1.5817924737930298
训练次数:3700, loss: 1.3802653551101685
训练次数:3800, loss: 1.273511290550232
训练次数:3900, loss: 1.397687554359436
整体测试集上的loss: 260.62813687324524
模型已保存
------第5轮训练开始------
训练次数:4000, loss: 1.4058566093444824
训练次数:4100, loss: 1.4356714487075806
训练次数:4200, loss: 1.559259295463562
训练次数:4300, loss: 1.202747106552124
训练次数:4400, loss: 1.168090581893921
训练次数:4500, loss: 1.3780189752578735
训练次数:4600, loss: 1.4468287229537964
整体测试集上的loss: 245.37890088558197
模型已保存
------第6轮训练开始------
训练次数:4700, loss: 1.356144666671753
训练次数:4800, loss: 1.5259275436401367
训练次数:4900, loss: 1.4029440879821777
训练次数:5000, loss: 1.4235470294952393
训练次数:5100, loss: 1.0321199893951416
训练次数:5200, loss: 1.3457319736480713
训练次数:5300, loss: 1.2305710315704346
训练次数:5400, loss: 1.4007431268692017
整体测试集上的loss: 230.55170679092407
模型已保存
------第7轮训练开始------
训练次数:5500, loss: 1.2273465394973755
训练次数:5600, loss: 1.2357081174850464
训练次数:5700, loss: 1.2203285694122314
训练次数:5800, loss: 1.2423707246780396
训练次数:5900, loss: 1.3699742555618286
训练次数:6000, loss: 1.5595101118087769
训练次数:6100, loss: 1.1178317070007324
训练次数:6200, loss: 1.0876398086547852
整体测试集上的loss: 216.72296237945557
模型已保存
------第8轮训练开始------
训练次数:6300, loss: 1.4506925344467163
训练次数:6400, loss: 1.1249005794525146
训练次数:6500, loss: 1.503798246383667
训练次数:6600, loss: 1.1748689413070679
训练次数:6700, loss: 1.0579890012741089
训练次数:6800, loss: 1.1448075771331787
训练次数:6900, loss: 1.0973633527755737
训练次数:7000, loss: 0.9629168510437012
整体测试集上的loss: 206.97115337848663
模型已保存
------第9轮训练开始------
训练次数:7100, loss: 1.2630302906036377
训练次数:7200, loss: 0.9677566885948181
训练次数:7300, loss: 1.1299266815185547
训练次数:7400, loss: 0.8496454954147339
训练次数:7500, loss: 1.2418136596679688
训练次数:7600, loss: 1.2850911617279053
训练次数:7700, loss: 0.9322866797447205
训练次数:7800, loss: 1.238295555114746
整体测试集上的loss: 199.7187734246254
模型已保存

    (2)在tensorboard中直接查看输出的损失值的变化情况,截图如下:
在这里插入图片描述

    (3)通过查看输出结果结合tensorboard的损失值变化情况图,随着训练次数的增加,损失值在优化器的作用下呈现出逐渐减小的趋势。

2.学习小结

    在本文总结了神经网络模型训练的一般步骤,并通过一个神经网络搭建的实例时间了神经网络模型搭建的具体方法,本文神经网络的训练是在GPU上进行的,当数据量较小时,训练耗时还能接受,但是当数据量较大时,用CPU训练耗时较长,因此在后续将介绍在GPU上进行神经网络训练的方法。

  • 11
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值