pytorch学习笔记----完整的训练套路

注意事项:1在训练的过重中喜欢将网络模型单独放在一个model.py文件里面,在训练脚本进行训练的时候只需要导入这个.py文件就可以了。除此之外,在模型脚本里面可以进行一定程度上的运行,防止网络出现问题。

 

 

 2.训练套路:下载数据集----》加载数据集------》定义网络模型-----》定义损失函数-----》定义学习率-------》定义优化器(可以搞个tensorboard)------>在epoch里面进行训练

 3.每进行100次迭代的时候可以打印下损失函数值,并且将损失函数值写进tensorboard里面

  if step%100 ==0:
            print("第 {} 次迭代,loss: {}".format(step,loss.item()))
            writer.add_scalar("train_loss",loss.item(),step)#在tensorboard上进行绘制每100个step和他的loss值
        step = step+1

 4.每训练完一个epoch之后,可以用验证集记性验证,在验证的时候参数不会进行更新,然后在验证完一轮之后给出验证集上的loss值和准确率(使用argmax进行计算)

 

 with torch.no_grad():#在这个模块下,不会计算节点的梯度
        for data in test_loader:
            imgs, targets = data
            output = network(imgs)  # 将图片送入网络中进行训练
            accuracy = (output.argmax(1) == targets).sum()
            loss = loss_fn(output, targets)  # 计算损失函数
            total_test_loss = total_test_loss +loss
            test_accuracy = test_accuracy+accuracy
    print("整体测试集的loss:{}".format(total_test_loss))
    print("整体测试集上预测正确率:{}".format(test_accuracy/len(test_datasets)))
    writer.add_scalar("epoch_test_loss",total_test_loss,epoch)
    writer.add_scalar("test_accuracy",test_accuracy,epoch)

 5.验证完,可以保存下这一轮训练的权重文件

 

#保存每一轮训练的模型
    torch.save(network,"network_{}.pth".format(epoch))#保存每一轮训练的模型

下面观看完整代码

1.train.py

import torchvision
from tensorboardX import SummaryWriter
from torch.nn import CrossEntropyLoss
from torch.utils.data import DataLoader
from torchvision import transforms
import ssl#导入ssl模块
from model import * #将网络部分导入进来

ssl._create_default_https_context = ssl._create_unverified_context  #全局取消证书认证
#从网络中获取数据集
train_datasets = torchvision.datasets.CIFAR10(root="../datasets2",train=True,transform=transforms.ToTensor(),download=True)
test_datasets = torchvision.datasets.CIFAR10(root="../datassts2",train=False,transform=transforms.ToTensor(),download=True)

#加载数据集
train_loader = DataLoader(dataset=train_datasets,batch_size=64)
test_loader = DataLoader(dataset=test_datasets,batch_size=64)

print(len(train_datasets))
print(len(test_datasets))


#定义网络模型,规范的使用model.py文件

network = NetWork()

#定义损失函数
loss_fn = CrossEntropyLoss()
#定义学习率
learning_rate = 0.01
#定义优化器
optim = torch.optim.SGD(params=network.parameters(),lr=learning_rate)

#定义tensorboard
writer = SummaryWriter("logs_train")

#进行训练
for epoch in range(3):
    print("-----第 {} 轮训练开始--------".format(epoch+1))
    step = 1
    for data in test_loader:
        imgs,targets = data
        output = network(imgs)#将图片送入网络中进行训练
        loss = loss_fn(output,targets)#计算损失函数
        optim.zero_grad()#使用优化器进行梯度请0
        loss.backward()#反向传播计算每个节点的梯度
        optim.step()#进行参更新
        if step%100 ==0:
            print("第 {} 次迭代,loss: {}".format(step,loss.item()))
            writer.add_scalar("train_loss",loss.item(),step)#在tensorboard上进行绘制每100个step和他的loss值
        step = step+1

    total_test_loss = 0
    test_accuracy = 0#在测试集计算一下正确率
    #每次训练完之后,会进行一个测试评估一下模型的效果,验证的时候就不需要进行梯度调优了
    with torch.no_grad():#在这个模块下,不会计算节点的梯度
        for data in test_loader:
            imgs, targets = data
            output = network(imgs)  # 将图片送入网络中进行训练
            accuracy = (output.argmax(1) == targets).sum()
            loss = loss_fn(output, targets)  # 计算损失函数
            total_test_loss = total_test_loss +loss
            test_accuracy = test_accuracy+accuracy
    print("整体测试集的loss:{}".format(total_test_loss))
    print("整体测试集上预测正确率:{}".format(test_accuracy/len(test_datasets)))
    writer.add_scalar("epoch_test_loss",total_test_loss,epoch)
    writer.add_scalar("test_accuracy",test_accuracy,epoch)
    #保存每一轮训练的模型
    torch.save(network,"network_{}.pth".format(epoch))#保存每一轮训练的模型

    print("模型已保存")

2.model.py

import torch
from torch import nn
from torch.nn import Sequential, Flatten

#定义网络部分
class NetWork(nn.Module):
    def __init__(self) -> None:  # 定义初始化方法
        super().__init__()
        self.model = Sequential(
            nn.Conv2d(3, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 32, 5, padding=2),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 5, padding=2),
            nn.MaxPool2d(2),
            Flatten(),
            nn.Linear(1024, 64),
            nn.Linear(64, 10)

        )

    def forward(self,x):#self类 是一个实例对象
        output = self.model(x)
        return output

#网络部分进行测试

if __name__ == '__main__':#使用这个判断语句可以对这个模块进行单独的测试,但是其他模块在调用这个模块的时候这个if判断语句会自动被忽略
    network = NetWork()
    input = torch.ones(64,3,32,32)#我认为第一个是batchsize,第二个是尺寸大小
    output = network(input)
    print(output)
    print(output.shape)#这个是64,10

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值