pytorch 6 batch_train 批训练操作

下面是关于pytorch 6 batch_train 批训练的完整攻略。

什么是批训练操作

在深度学习中,一般将训练数据分成一个个的batch,每个batch都可以看做是一个小的数据集。在批训练操作中,模型将对每个batch进行一次前向传播和反向传播,在更新梯度的过程中,使用所有batch的梯度的平均值。这样可以有效地加速训练进程,减小了内存占用和梯度更新的波动。

在pytorch中,批训练操作可以通过使用torch.utils.data.DataLoadertorch.optim.SGD两个类实现。

如何进行批训练操作

1. 导入相关库

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader

2. 准备数据

使用torch.utils.data.Dataset类创建数据集,并使用torch.utils.data.DataLoader类创建数据加载器。

class MyDataset(torch.utils.data.Dataset):
    def __init__(self):
        self.x = torch.randn(100, 10)
        self.y = torch.randint(2, (100,))

    def __getitem__(self, idx):
        return self.x[idx], self.y[idx]

    def __len__(self):
        return len(self.x)

dataset = MyDataset()
loader = DataLoader(dataset=dataset, batch_size=10, shuffle=True)

3. 准备模型和损失函数

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.fc2 = nn.Linear(5, 2)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = MyModel()
criterion = nn.CrossEntropyLoss()

4. 准备优化器

optimizer = optim.SGD(model.parameters(), lr=0.1)

5. 训练模型

for epoch in range(num_epochs):
    for i, (inputs, labels) in enumerate(loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        if (i+1) % log_step == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(loader)}], Loss: {loss.item():.4f}')

批训练操作的示例

示例1:使用MNIST数据集进行分类

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision.datasets import MNIST
from torchvision.transforms import transforms
from torch.utils.data import DataLoader

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

train_dataset = MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)

test_dataset = MNIST(root='./data', train=False, transform=transform, download=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = nn.Conv2d(1, 16, kernel_size=5)
        self.bn1 = nn.BatchNorm2d(16)
        self.conv2 = nn.Conv2d(16, 32, kernel_size=5)
        self.bn2 = nn.BatchNorm2d(32)
        self.fc1 = nn.Linear(32 * 4 * 4, 10)

    def forward(self, x):
        x = torch.relu(self.bn1(self.conv1(x)))
        x = nn.functional.max_pool2d(x, 2)
        x = torch.relu(self.bn2(self.conv2(x)))
        x = nn.functional.max_pool2d(x, 2)
        x = x.view(-1, 32 * 4 * 4)
        x = self.fc1(x)
        return x

model = MyModel()
criterion = nn.CrossEntropyLoss()

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

num_epochs = 10
log_step = 100

for epoch in range(num_epochs):
    for i, (inputs, labels) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        if (i+1) % log_step == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

    # 每个epoch结束后,对模型进行一个测试
    with torch.no_grad():
        total = 0
        correct = 0
        for inputs, labels in test_loader:
            outputs = model(inputs)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
        accuracy = 100 * correct / total
        print(f'Test Accuracy: {accuracy:.2f}%')

示例2:使用CIFAR10数据集进行分类

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision.datasets import CIFAR10
from torchvision.transforms import transforms
from torch.utils.data import DataLoader

transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

train_dataset = CIFAR10(root='./data', train=True, transform=transform_train, download=True)
train_loader = DataLoader(dataset=train_dataset, batch_size=128, shuffle=True)

test_dataset = CIFAR10(root='./data', train=False, transform=transform_test, download=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=128, shuffle=False)

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(64)
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.conv3 = nn.Conv2d(128, 256, kernel_size=3, padding=1)
        self.bn3 = nn.BatchNorm2d(256)
        self.conv4 = nn.Conv2d(256, 512, kernel_size=3, padding=1)
        self.bn4 = nn.BatchNorm2d(512)
        self.fc1 = nn.Linear(512 * 4 * 4, 512)
        self.bn5 = nn.BatchNorm1d(512)
        self.fc2 = nn.Linear(512, 10)

    def forward(self, x):
        x = torch.relu(self.bn1(self.conv1(x)))
        x = nn.functional.max_pool2d(x, 2)
        x = torch.relu(self.bn2(self.conv2(x)))
        x = nn.functional.max_pool2d(x, 2)
        x = torch.relu(self.bn3(self.conv3(x)))
        x = nn.functional.max_pool2d(x, 2)
        x = torch.relu(self.bn4(self.conv4(x)))
        x = nn.functional.max_pool2d(x, 2)
        x = x.view(-1, 512 * 4 * 4)
        x = torch.relu(self.bn5(self.fc1(x)))
        x = self.fc2(x)
        return x

model = MyModel()
criterion = nn.CrossEntropyLoss()

optimizer = optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=1e-4)

num_epochs = 10
log_step = 100

for epoch in range(num_epochs):
    for i, (inputs, labels) in enumerate(train_loader):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        if (i+1) % log_step == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')

    # 每个epoch结束后,对模型进行一个测试
    with torch.no_grad():
        total = 0
        correct = 0
        for inputs, labels in test_loader:
            outputs = model(inputs)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
        accuracy = 100 * correct / total
        print(f'Test Accuracy: {accuracy:.2f}%')

以上就是关于pytorch 6 batch_train 批训练操作的攻略和两个示例的说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch 6 batch_train 批训练操作 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 使用django-crontab实现定时任务的示例

    下面是使用django-crontab实现定时任务的完整攻略: 一、什么是django-crontab django-crontab 是一个第三方 Django 应用,它可以让你在 Django 项目中设置定时任务。它的优点在于,你不需要使用外部的系统来运行定时任务(如 Cron、Celery),而是直接通过在 Django 项目中设置定时任务来完成。 dj…

    人工智能概览 2023年5月25日
    00
  • OMEN暗影精灵8 Pro值得入手吗 OMEN暗影精灵8 Pro游戏本评测

    OMEN暗影精灵8 Pro游戏本评测 概述 OMEN暗影精灵8 Pro是一款专为游戏玩家打造的高性能笔记本电脑。它搭载了英特尔酷睿i7处理器、英伟达GeForce RTX 3070显卡等顶级配置,提供了出色的游戏性能。同时,它还具有优秀的散热效果和舒适的键盘手感,是一款非常值得推荐的游戏本。 性能 OMEN暗影精灵8 Pro采用了英特尔酷睿i7处理器和英伟达…

    人工智能概览 2023年5月25日
    00
  • Spring使用支付宝扫码支付

    当我们在开发电商网站时,支付功能是必不可少的。支付宝是国内最常用的第三方支付平台之一,其扫码支付功能也非常受欢迎。本文将为您详细讲解如何使用Spring实现支付宝扫码支付。 准备工作 在开始使用支付宝扫码支付前,我们需要做准备工作: 注册支付宝开发者账号,并创建应用 引入支付宝SDK 在应用中配置支付宝参数,包括应用ID、私钥等信息 编写后台代码对接支付宝支…

    人工智能概论 2023年5月25日
    00
  • C++之openFrameworks框架介绍

    C++之openFrameworks框架介绍 什么是openFrameworks openFrameworks是一个开源的C++跨平台创意编程框架,旨在使创意编程变得更加容易、更容易使用并且开放。它通过封装大量的C++库和硬件驱动程序,提供了一种快速开发原型、制作交互式的多媒体应用程序、绘画、制作自动化等领域的框架。它支持多种操作系统,如Linux、MacO…

    人工智能概览 2023年5月25日
    00
  • 宏碁传奇Go全能本怎么样 宏碁2023传奇Go全能本评测

    宏碁传奇Go全能本评测 产品介绍 宏碁传奇Go全能本是一款适用于办公、学习和轻度娱乐领域的笔记本电脑。该产品采用了第11代英特尔酷睿处理器,搭配了独显和高速固态硬盘等配置,其性能表现较为优异。该电脑的价格也比同级别的产品更加亲民。 外观与手感 宏碁传奇Go全能本采用了绿色为主色调的外壳设计,有着较高的辨识度。该产品的机身厚度较为薄,重量也相对较轻,携带便利。…

    人工智能概览 2023年5月25日
    00
  • SpringBoot创建RSocket服务器的全过程记录

    下面是关于Spring Boot创建RSocket服务器的全过程记录。 RSocket简介 RSocket是一种基于Reactive Streams规范并且支持多种传输协议的全双工网络通信协议,可以实现高效、可扩展、快速启动的微服务通信。它由Netty、Reactor和Spring团队合作开发,提供Java、Kotlin和其他语言的客户端和服务器端实现,是S…

    人工智能概览 2023年5月25日
    00
  • python疲劳驾驶困倦低头检测功能的实现

    Python疲劳驾驶困倦低头检测功能的实现是一种人脸识别技术,它可以通过摄像头捕捉图像,识别人的面部特征,判断其是否疲劳、困倦或者低头,给出警报提醒,从而保障驾车安全。实现该功能的方法有很多种,以下是其中的一种攻略: 步骤一:安装必要的Python第三方库 要实现该功能需要使用到Python的第三方库,最重要的是OpenCV库和dlib库,需要先在Pytho…

    人工智能概览 2023年5月25日
    00
  • 关于Python网络爬虫requests库的介绍

    下面是对Python网络爬虫requests库的介绍: 一、什么是requests库 requests库是Python中一个常用的HTTP客户端库,可以帮助我们简化HTTP请求过程中的重复代码。requests库可以轻松地与所有类型的Web服务进行交互。 二、requests库的使用 1. 基本的HTTP请求 在requests库中,HTTP请求是通过Req…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部