12 - PyTorch的模型整体训练流程讲解

75 篇文章 2 订阅

1. 准备

  • 数据集
    (1)Dataset:将数据打包成一个(features,labels)对
    (2)DataLoader将Dataset按给定批量大小batchsize打包成一个DataLoader
  • 神经网络
    (1)class Netural_Network神经网络机构
    (2)forward 前向传播函数
  • 超参数
    (1)batch_size:批量大小
    (2)learning_rate:学习率
    (3)epoch:迭代周期
  • 损失函数
    (1)loss_fn = nn.CrossEntropyLoss();
  • 优化器
    (1)optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
  • 训练模式
    我们假设训练集中有样本(x,y),假设神经网络为f(x);损失函数为l(x)
    l ( x ) = l o s s f n [ f ( x ) , y ] l(x)=lossfn[f(x),y] l(x)=lossfn[f(x),y]
  • 将我们得到的f(x);通过给定x得到预测 pred=f(x)

2. 代码

  • datasets
  • dataloader
  • NeuralNetwork
# 1.导入相关数据库
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda

# 2.得到datasets
training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor()
)

test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor()
)

# 3. 通过datasets得到dataloader
train_dataloader = DataLoader(training_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)

# 4. 得到神经网络
class NeuralNetwork(nn.Module):
	# 定义神经网络结构
    def __init__(self):
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),
            nn.ReLU(),
            nn.Linear(512, 512),
            nn.ReLU(),
            nn.Linear(512, 10),
        )
	# 定义数据前向传播函数
    def forward(self, x):
        x = self.flatten(x)
        logits = self.linear_relu_stack(x)
        return logits
        
# 5. 实例化神经网络
model = NeuralNetwork()
  • Hyperparameters
    一旦我们设置了超参数,我们就可以通过优化循环训练和优化我们的模型。优化循环的每次迭代称为epoch
    每个epoch由两个主要部分组成
    (1)训练循环:迭代训练数据集,并尝试收敛到最优参数。
    (2)验证/测试循环:迭代测试数据集,检查模型性能是否得到改善
# 学习率
learning_rate = 1e-3
# 批量大小
batch_size = 64
# 迭代周期
epochs = 5
  • loss-function
    损失函数的作用是为了测量神经网络输出值和目标标签的差距,我们的目标是希望损失越来越小,这样我们得到的神经网络就更适合做预测;常用的损失函数包括nn.MSELoss,(Mean Square Error, MSELoss);NLLLoss(负对数似然)用于分类。神经网络。CrossEntropyLoss结合了神经网络。LogSoftmax nn.NLLLoss。
# Initialize the loss function
# 交叉熵损失函数
loss_fn = nn.CrossEntropyLoss()
  • optimizer
    优化是在每个训练步骤中调整模型参数以减少模型误差的过程。优化算法定义了这个过程是如何执行的(在这个例子中,我们使用随机梯度下降法)。所有优化逻辑都封装在优化器对象中。这里,我们使用SGD优化器;此外,PyTorch中还有许多不同的优化器,比如ADAM和RMSProp,它们可以更好地处理不同类型的模型和数据。我们通过记录需要训练的模型参数,并传入学习速率超参数来初始化优化器
# 定义优化器,将模型中需要训练的参数和学习率传入到优化器中
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

在训练循环中,优化分为三个步骤:
(1)调用 optimizer.zero_grad()将模型的参数清零。参数的梯度在默认情况下是叠加的;为了防止重复计算,我们在每次迭代时显式地将它们归零。
(2)通过调用loss.backward()反向传播预测损失;pytorch 保留了模型中每个参数的梯度,每次通过梯度来更新参数
(3)一旦我们有了梯度,我们调用optimizer.step()来应用向后传递收集的梯度来调整参数

3. 整体应用

def train_loop(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    # 从训练的dataloader中拿到(features,labels)=(x,y)
    for batch, (X, y) in enumerate(dataloader):
        # Compute prediction and loss
        # 通过神经网络,我们给定x得到预测pred
        pred = model(X)
        # 将pred和标签y计算得到损失loss
        loss = loss_fn(pred, y)

        # Backpropagation
        # 优化器梯度清零
        optimizer.zero_grad()
        # 损失回传
        loss.backward()
        # 优化器更新
        optimizer.step()

        if batch % 100 == 0:
            loss, current = loss.item(), batch * len(X)
            print(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")


def test_loop(dataloader, model, loss_fn):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    test_loss, correct = 0, 0
	
	# 预测不需要更新模型,也就不需要计算梯度,故用with torch.no_grad()
    with torch.no_grad():
    # 从预测dataloader中拿到(features,label)=(x,y)
        for X, y in dataloader:
        #  通过模型得到预测pred
            pred = model(X)
            # 为了测试损失
            test_loss += loss_fn(pred, y).item()
            # 将预测值最大的一项定义为正确预测值
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()

    test_loss /= num_batches
    correct /= size
    print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

我们初始化loss函数和优化器,并将其传递给train_loop和test_loop。您可以随意增加epoch的数量,以跟踪模型的改进性能

# 定义损失函数
loss_fn = nn.CrossEntropyLoss()
# 定义优化器并将模型的参数和学习率传入到优化器中
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 开始迭代
epochs = 10
for t in range(epochs):
    print(f"Epoch {t+1}\n-------------------------------")
    # 训练
    train_loop(train_dataloader, model, loss_fn, optimizer)
    # 测试
    test_loop(test_dataloader, model, loss_fn)
print("Done!")
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: yolov5-pytorch模型部署可以通过以下步骤实现: 1. 安装必要的依赖库,如pytorch、numpy、opencv等。 2. 下载yolov5-pytorch模型,并将其加载到内存中。 3. 准备待检测的图像或视频数据。 4. 对待检测的数据进行预处理,如缩放、归一化等。 5. 将预处理后的数据输入到yolov5模型进行检测。 6. 解析检测结果,并将其可视化或保存到文件中。 7. 可以将部署好的模型封装成API接口,供其他应用程序调用。 需要注意的是,模型部署的具体实现方式可能因应用场景而异,例如在嵌入式设备上部署时可能需要进行模型压缩和量化等操作。 ### 回答2: yolov5-pytorch是一种目标检测算法,能够在图像中检测到人、车、建筑等物体,因此在工业生产、医学影像、智能交通等领域得到了广泛的使用。在应用场景中,通常需要将yolov5-pytorch模型部署在服务器上,以便实现实时检测与处理的需求。 要部署yolov5-pytorch模型,需要以下步骤: 1. 准备工作 - 安装pytorch和opencv等依赖库; - 下载yolov5-pytorch源码; - 准备训练集并训练模型。 2. 模型测试 对于训练好的模型,需要进行测试以验证其性能。 - 使用测试集或者视频等数据进行测试; - 可以使用官方提供的test.py或者自定义脚本进行测试; - 统计模型的 AP、F1 score、precision等数据,并分析模型性能和精度。 3. 模型部署 - 可以使用flask等框架进行部署; - 按照官方提供的推理代码进行部署; - 必要时进行模型量化、裁剪等优化操作,以减小模型大小和加速推理速度; - 针对不同的应用场景,可以构建不同的数据预处理和后处理流程,提高模型的优化和性能。 总之,对于yolov5-pytorch模型部署来说,关键是理解原理和基本操作,并结合实际应用场景进行优化和测试。只有在实践中不断探索和改进,才能够实现高效、精确的目标检测应用。 ### 回答3: YOLOv5是最近比较火的目标检测模型,其结构简单,速度快,准确率高,因此得到了广泛的应用。在生产环境中,我们需要将YOLOv5模型部署到特定的硬件设备上,以便快速地对图像或视频流进行实时的目标检测和识别。本文将介绍如何将YOLOv5模型部署到Pytorch环境中。 1. 准备工作 在开始部署模型之前,我们需要做一些准备工作: - 安装Pytorch和torchvision - 下载YOLOv5源代码 - 下载预训练权重文件 2. 模型转换 我们需要将YOLOv5的模型转换成适合部署的格式。YOLOv5的模型结构采用Pytorch实现,我们需要将其转换为ONNX格式,以便部署到不同的硬件设备上。通过执行以下命令可以将模型转换为ONNX格式: python models/export.py --weights yolov5s.pt --img 640 --batch 1 3. 部署模型 将生成的ONNX模型导入到Pytorch环境中,并使用特定的库将其部署到硬件设备上。部署的目标设备可能有所不同,例如,我们可以将模型部署到树莓派、Jetson Nano等低功耗嵌入式设备,也可以将其部署到高端GPU服务器中,以实现更快速的目标检测。 在部署模型时,我们需要使用特定的库和API,例如TensorRT、OpenVino等。这些库可以提高模型在不同硬件设备上的性能和速度。 4. 测试模型 部署模型后,我们需要对其进行测试。我们可以使用现有的数据进行测试,也可以使用摄像头或者图像流实时进行目标检测。我们需要对检测结果进行验证,包括检测结果是否准确、检测速度是否满足要求等。 5. 优化模型 在部署模型时,我们也需要考虑优化模型以提高其性能和速度。优化模型的方法包括: - 模型剪枝和量化 - 使用特定的库和API - 模型硬件加速 总结 通过以上步骤,我们可以将YOLOv5模型部署到Pytorch环境中,并实现高效的目标检测。随着硬件设备的不断升级和优化,我们可以不断地探索如何优化模型以适应更多的应用场景,提高模型的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值