学习笔记pytorch——一个完整的神经网络模型训练套路

准备数据和加载数据

#准备数据
train_data=torchvision.datasets.CIFAR10("./dataset", train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_data=torchvision.datasets.CIFAR10('./dataset', train=False, transform=torchvision.transforms.ToTensor(), download=True)
#Q1:训练数据和测试数据存到一个路径可以吗-->答案是可以

#查看训练集和测试集中图片的数量
train_len=len(train_data)
test_len=len(test_data)
#利用dataloader加载数据
train_loader=DataLoader(train_data, batch_size=64)
test_loader=DataLoader(test_data, batch_size=64)

tips:ctrl+p:可查看所调用的函数的参数


搭建网络框架

import torch
from torch import nn

#搭建网络架构
class Tudui(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        self.model=nn.Sequential(
            nn.Conv2d(3, 32, 5, stride=1, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, stride=1, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, stride=1, padding=2),
            nn.MaxPool2d(2),
            nn.Flatten(),
            nn.Linear(64*4*4, 64),
            nn.Linear(64, 10)
        )
    def forward(self, x):
        x = self.model(x)
        return x

tips:

  • 可将整个网络框架写入一个新的model.py文件中,然后在同一个文件夹目录下,直接使用from model import *调用

  • 可在model.py文件中直接写入main来测试model,#if __name__ == '__main__'理解为: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。

#测试网络架构
#if __name__ == '__main__'理解为: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
if __name__ == '__main__':
    tudui=Tudui()
    input=torch.ones((64, 3, 32, 32))
    output=tudui(input)
    print(output.shape)

创建网络模型

tudui=Tudui()

损失函数

loss_fn = nn.CrossEntropyLoss()

调用优化器

optimizer=torch.optim.Adam(tudui.parameter(), lr=0,01)

设置训练网络的参数

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

开始训练和测试过程

#训练过程
for i in range(epoch):
    print("--------第{}次训练开始--------".format(i))
    for data in train_loader:
        imgs, targets = data
        output=tudui(imgs)
        loss = loss_fn(output, 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))

    #测试过程
    total_test_loss=0
    with torch.no_grad():
        for data in test_loader:
            imgs, targets= data
            output=tudui(imgs)
            loss=loss_fn(output, targets)
            total_test_loss=total_test_loss+loss
    total_test_step=total_test_step+1
    print("测试次数:{},loss:{}".format(total_test_step, total_test_loss))

训练过程tips:

  • 训练一般不止一轮,训练集中所有的数据跑完一遍是一个epoch
  • format的使用:字符串格式化,format()括号中的内容取代引号中{}的内容
  • 优化器调优时要先将梯度清零,即optimizer.zero_grad(),再进行反向传播

测试过程tips:

  • 在训练集跑完一轮后,进行一次测试,模型是已经训练好的,因此不需要调用grad
  • 计算的损失是在整个测试集上的损失
  • item()的使用:取出单元素张量的元素值并返回该值,保持原元素类型不变。

使用tensorboard绘图

writer=SummaryWriter("./logs_train")
 writer.add_scalar("train_loss", loss, total_train_step)
 writer.add_scalar("test_loss", total_test_loss, total_test_step)
writer.close()

绘图过程

在terminal中输入tensorboard --logdir=logs_train,并回车,即可打开tensorboard窗口

学习笔记pytorch——一个完整的神经网络模型训练套路_第1张图片

绘图结果

学习笔记pytorch——一个完整的神经网络模型训练套路_第2张图片


模型的保存

 #模型的保存
    torch.save(tudui, "tudui_{}".format(i))
    print("tudui已保存")

tips:

  • torch.save(tudui,""):保存的是模型的框架和模型的参数

测试正确率

 accuracy=(output.argmax(1)==targets).sum()
 total_accuracy=total_accuracy+accuracy
 writer.add_scalar("准确率", total_accuracy/test_len, total_test_step)

测试结果

学习笔记pytorch——一个完整的神经网络模型训练套路_第3张图片


补充项

tudui.train()
tudui.eval()

tips:

  • tudui.train在网络具有某些层:例如dropout,batchnorm时需要设置,
  • tudui.eval同理

你可能感兴趣的:(pytorch学习,神经网络,pytorch,深度学习)