用Pytorch训练CNN(数据集MNIST,使用GPU的方法)

yizhihongxing

以下是使用PyTorch训练CNN(数据集MNIST,使用GPU的方法)的完整攻略。

步骤一:导入必要的库

首先,我们需要导入必要的库,包括PyTorch、torchvision、numpy和matplotlib等。

import torch
import torchvision
import numpy as np
import matplotlib.pyplot as plt

步骤二:加载数据集

接下来,我们需要加载MNIST数据集。可以使用torchvision中的datasets模块来加载数据集。

train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=torchvision.transforms.ToTensor(), download=True)

步骤三:定义模型

我们使用一个简单的卷积神经网络来实现手写数字识别。定义模型的代码如下:

class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = torch.nn.Conv2d(1, 32, kernel_size=5, padding=2)
        self.conv2 = torch.nn.Conv2d(32, 64, kernel_size=5, padding=2)
        self.fc1 = torch.nn.Linear(7 * 7 * 64, 1024)
        self.fc2 = torch.nn.Linear(1024, 10)

    def forward(self, x):
        x = torch.nn.functional.relu(self.conv1(x))
        x = torch.nn.functional.max_pool2d(x, 2)
        x = torch.nn.functional.relu(self.conv2(x))
        x = torch.nn.functional.max_pool2d(x, 2)
        x = x.view(-1, 7 * 7 * 64)
        x = torch.nn.functional.relu(self.fc1(x))
        x = torch.nn.functional.dropout(x, training=self.training)
        x = self.fc2(x)
        return torch.nn.functional.log_softmax(x, dim=1)

model = Net()

步骤四:定义损失函数和优化器

我们使用交叉熵损失函数和随机梯度下降优化器来训练模型。

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

步骤五:将模型和数据移动到GPU上

我们需要将模型和数据移动到GPU上进行训练。

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)

步骤六:训练模型

接下来,我们使用训练集对模型进行训练。

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)

for epoch in range(10):
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.item()))

步骤七:测试模型

最后,我们使用测试集对模型进行测试。

test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1000, shuffle=True)

with torch.no_grad():
    correct = 0
    total = 0
    for data, target in test_loader:
        data, target = data.to(device), target.to(device)
        output = model(data)
        _, predicted = torch.max(output.data, 1)
        total += target.size(0)
        correct += (predicted == target).sum().item()

    print('Accuracy of the network on the 10000 test images: %d %%' % (
        100 * correct / total))

上面的代码实现了使用PyTorch训练CNN(数据集MNIST,使用GPU的方法)。下面是两个示例:

示例一:显示数据集中的张图片

image, label = train_dataset[0]
plt.imshow(image.squeeze().numpy(), cmap='gray')
plt.title('Label: %d' % label)
plt.show()

示例二:显示模型的预测结果

image, label = test_dataset[0]
image = image.to(device)
output = model(image.unsqueeze(0))
_, predicted = torch.max(output.data, 1)
plt.imshow(image.cpu().squeeze().numpy(), cmap='gray')
plt.title('Predicted: %d, Actual: %d' % (predicted.item(), label))
plt.show()

上面的代码分别显示了数据集中的一张图片和模型的预测结果。

总结:以上就是使用PyTorch训练CNN(数据集MNIST,使用GPU的方法)的完整攻略,包括数据集的加载、模型的定义、损失函数和优化器的定义、将模型和数据移动到GPU上、模型的训练和测试,以及两个示例的展示。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用Pytorch训练CNN(数据集MNIST,使用GPU的方法) - Python技术站

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

相关文章

  • NumPy 与 Python 内置列表计算标准差区别详析

    NumPy 与 Python 内置列表计算标准差区别详析 标准差是统计学中常用的一种测量数据离散程度的方法。在 Python 中,我们可以使用 NumPy 和内置列表来计算标准差。本文将详细介绍 NumPy 和内置列表计算标准差的区别。 NumPy 计算标准差 NumPy 是 Python 中用于科学计算的一个重要库,其中包含了许多用于数组计算的函数。下面是…

    python 2023年5月14日
    00
  • python numpy库np.percentile用法说明

    以下是关于“python numpy库np.percentile用法说明”的完整攻略。 背景 在numpy库中,我们可以使用np.percentile()函数来计算数组中的百分位数。本攻略将介绍如使用np.percentile()函数,并提供两个示例来演示如何使用np.percentile()函数计算数组中的百位数。 np.percentile()函数 np…

    python 2023年5月14日
    00
  • pytorch实现图像识别(实战)

    PyTorch实现图像识别(实战)攻略 前言 图像识别是计算机视觉领域的一个重要应用,而深度学习技术在图像识别中发挥了重要作用。PyTorch是深度学习领域的一个强大工具,本文将介绍如何使用PyTorch实现图像识别。 环境 在实现图像识别之前,需要确保安装了正确的开发环境,包括: Python 3.x版本 PyTorch 1.x版本 Torchvision…

    python 2023年5月13日
    00
  • Numpy数组的保存与读取方法

    Numpy数组的保存与读取方法 Numpy是Python中用于科学计算的一个重要库,它提供了高效的多维数组对象和各种派生对象,包括矩和张量等。本攻略将详细介绍Python Numpy数组的保存与读取方法。 Numpy数组的保存方法 我们可以使用numpy.save()函数将Numpy数组保存到磁盘中。下面是一个将Numpy数组保存到磁盘中的示例: impor…

    python 2023年5月13日
    00
  • 详解NumPy中数组的索引和切片(访问元素)

    在 NumPy 中,可以使用索引和切片来访问数组中的元素。两者的区别为: 索引是用于访问单个元素的操作; 切片则是用于访问一组元素的操作。 索引 NumPy 中的索引方式与 Python 中的相似,使用方括号 [] 来访问数组中的元素。数组的索引从 0 开始,使用整数值来进行访问。 例如,我们可以通过以下方式访问一个二维数组中的某个元素: import nu…

    2023年2月28日
    00
  • 详解MindSpore自定义模型损失函数

    在MindSpore中,可以使用自定义模型损失函数来训练模型。本攻略将详细介绍如何自定义模型损失函数,并提供两个示例说明。以下是整个攻略的步骤: 自定义模型损失函数 自定义模型损失函数需要满足以下要求: 输入参数为模型的输出和标签。 输出为一个标量,表示损失值。 损失函数应该是可微的,以便进行反向传播。 可以使用以下代码定义一个自定义模型损失函数: impo…

    python 2023年5月14日
    00
  • python numpy库中数组遍历的方法

    在Python的NumPy库中,数组遍历是一个常见的操作,本文将详细讲解NumPy库中数组遍历的方法,包括使用for循环遍历数组、使用nditer函数历数组等方面。 使用for循环遍历数组 在Python中,可以使用for循环遍历数组中的每个元素。下面是示例: import numpy as np# 定义一个数组 a = np.array([1, 2, 3,…

    python 2023年5月14日
    00
  • pycharm中出现no module named xlwt的原因及解决

    在PyCharm中,当我们使用import语句导入xlwt模块时,可能会出现no module named xlwt的错误。以下是解决这个问题的详细攻略: 检查模块是否安装 在PyCharm中出现no module named xlwt的错误,可能是因为我们没有安装xlwt模块。为了解决这个问题,我们可以使用pip命令安装xlwt模块。以下是一个使用pip命…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部