Pytorch中实现CPU和GPU之间的切换的两种方法

在PyTorch中,我们可以使用CPU和GPU来加速模型的训练和推理。在本文中,我们将深入探讨如何在PyTorch中实现CPU和GPU之间的切换。

方法一:手动切换

在PyTorch中,我们可以使用.to()方法手动将张量或模型从CPU切换到GPU,或从GPU切换到CPU。下面是一个示例:

import torch

# 创建一个张量
x = torch.randn(10, 10)

# 将张量从CPU切换到GPU
x = x.to('cuda')

# 将张量从GPU切换到CPU
x = x.to('cpu')

在这个示例中,我们首先创建了一个张量x。然后,我们使用.to()方法将张量从CPU切换到GPU,并将其赋值给x。最后,我们使用.to()方法将张量从GPU切换到CPU,并将其赋值给x

方法二:自动切换

在PyTorch中,我们可以使用torch.device()函数来定义设备。然后,我们可以使用.to()方法将模型或张量移动到指定的设备。下面是一个示例:

import torch

# 定义设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 创建一个张量
x = torch.randn(10, 10)

# 将张量移动到指定的设备
x = x.to(device)

在这个示例中,我们首先使用torch.device()函数定义设备。如果GPU可用,则使用GPU,否则使用CPU。然后,我们创建了一个张量x。最后,我们使用.to()方法将张量移动到指定的设备。

示例说明

示例1:在CPU和GPU之间进行模型训练

import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision.datasets as datasets

# 定义设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 加载数据集
train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)

# 定义模型
model = nn.Sequential(
    nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Flatten(),
    nn.Linear(64 * 7 * 7, 10)
)

# 将模型移动到指定的设备
model.to(device)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 训练模型
for epoch in range(10):
    for i, (images, labels) in enumerate(train_loader):
        # 将数据移动到指定的设备
        images = images.to(device)
        labels = labels.to(device)

        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # 打印训练信息
        if (i + 1) % 100 == 0:
            print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch + 1, 10, i + 1, len(train_loader), loss.item()))

在这个示例中,我们首先定义了设备,如果GPU可用,则使用GPU,否则使用CPU。然后,我们加载了MNIST数据集,并定义了一个卷积神经网络模型。接下来,我们使用.to()方法将模型移动到指定的设备。然后,我们定义了损失函数和优化器。最后,我们使用.to()方法将数据移动到指定的设备,并在训练过程中进行前向传播、反向传播和优化。

示例2:在CPU和GPU之间进行模型推理

import torch
import torch.nn as nn
import torchvision.transforms as transforms
from PIL import Image

# 定义设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 加载图像
image = Image.open('image.jpg')

# 定义图像预处理
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor()
])

# 进行图像预处理
image_tensor = transform(image)

# 定义模型
model = nn.Sequential(
    nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
    nn.ReLU(),
    nn.MaxPool2d(kernel_size=2, stride=2),
    nn.Flatten(),
    nn.Linear(128 * 28 * 28, 10)
)

# 加载模型权重
model.load_state_dict(torch.load('model.pth'))

# 将模型移动到指定的设备
model.to(device)

# 进行模型推理
with torch.no_grad():
    image_tensor = image_tensor.to(device)
    output_tensor = model(image_tensor.unsqueeze(0))
    output = output_tensor.cpu().numpy()

# 打印输出结果
print(output)

在这个示例中,我们首先定义了设备,如果GPU可用,则使用GPU,否则使用CPU。然后,我们加载了一张图像,并使用transforms类定义了一个图像预处理。接下来,我们使用.to()方法将图像张量移动到指定的设备。然后,我们定义了一个卷积神经网络模型,并使用.to()方法将模型移动到指定的设备。然后,我们加载了模型权重,并使用with torch.no_grad()语句关闭梯度计算,以加速模型推理。最后,我们使用.cpu()方法将输出张量移动到CPU,并将其转换为NumPy数组,以便打印输出结果。

总之,在PyTorch中实现CPU和GPU之间的切换非常简单。我们可以使用.to()方法手动将张量或模型从CPU切换到GPU,或从GPU切换到CPU。我们也可以使用torch.device()函数定义设备,并使用.to()方法将模型或张量移动到指定的设备。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytorch中实现CPU和GPU之间的切换的两种方法 - Python技术站

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

相关文章

  • 神经网络训练采用gpu设置的方式

    以下是关于“神经网络训练采用 GPU 设置的方式”的完整攻略,其中包含两个示例说明。 示例1:使用单个 GPU 进行训练 步骤1:导入必要库 在使用 GPU 进行训练之前,我们需要导入一些必要的库,包括torch。 import torch 步骤2:定义模型和数据 在这个示例中,我们使用随机生成的数据和模型来演示如何使用单个 GPU 进行训练。 # 定义随机…

    PyTorch 2023年5月16日
    00
  • Pytorch在各个领域应用的github仓库合集

    这份合集列表中包含了与pytorch有关的各种教程,项目,库,视频,文章,书籍等等,可谓是极其丰富了。 表单数据 教程 可视化 可解释性 物体检测 长拖尾 / Out-of-Distribution Recognition 基于能量的学习 缺失数据 架构搜索 优化 量化 量子机器学习 神经网络压缩 面部,行为和姿势识别 超分辨率 Synthetesizing…

    PyTorch 2023年4月8日
    00
  • PyTorch——(7) MNIST手写数字识别实例

    代码 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms batch_size=200 learning_rate=0.01 epo…

    2023年4月8日
    00
  • Anaconda+Pycharm+Pytorch虚拟环境创建(各种包安装保姆级教学)

    以下是Anaconda+Pycharm+Pytorch虚拟环境创建的完整攻略,包括两个示例说明。 1. 安装Anaconda 首先需要安装Anaconda,可以从官网下载对应的安装包进行安装。安装完成后,可以在终端中输入以下命令检查是否安装成功: conda –version 如果输出了版本号,则表示安装成功。 2. 创建虚拟环境 在使用PyTorch时,…

    PyTorch 2023年5月15日
    00
  • PyTorch一小时掌握之autograd机制篇

    PyTorch一小时掌握之autograd机制篇 在本文中,我们将介绍PyTorch的autograd机制,这是PyTorch的一个重要特性,用于自动计算梯度。本文将包含两个示例说明。 autograd机制的基本概念 在PyTorch中,autograd机制是用于自动计算梯度的核心功能。它可以根据输入和计算图自动计算梯度,并将梯度存储在张量的.grad属性中…

    PyTorch 2023年5月15日
    00
  • Pytorch之可视化

    先解决下keras可视化安装graphviz的问题: 注意安装顺序: sudo pip3 install graphviz # python包 sudo apt-get install graphviz # 软件本身 sudo pip3 install pydot sudo pip3 install pydot-ng # 版本兼容需要,可选   1.  使用…

    2023年4月8日
    00
  • pytorch 的max函数

    torch.max(input) → Tensor 返回输入tensor中所有元素的最大值 a = torch.randn(1, 3)>>0.4729 -0.2266 -0.2085 torch.max(a)>>0.4729    torch.max(input, dim, keepdim=False, out=None) ->…

    PyTorch 2023年4月6日
    00
  • Pytorch 入门之Siamese网络

    首次体验Pytorch,本文参考于:github and  PyTorch 中文网人脸相似度对比         本文主要熟悉Pytorch大致流程,修改了读取数据部分。没有采用原作者的ImageFolder方法:   ImageFolder(root, transform=None, target_transform=None, loader=defaul…

    2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部