PyTorch中的神经网络 Mnist 分类任务

PyTorch是深度学习领域最受欢迎的框架之一,它不仅易于使用,而且还灵活高效。本文将详细讲解如何在PyTorch中实现MNIST分类任务,让您更加深入地了解PyTorch的使用。

准备工作

在实现MNIST分类任务之前,我们需要以下库:

  • PyTorch 用于构建神经网络模型
  • torchvision 用于获取MNIST数据集
  • matplotlib 用于可视化结果

需要确保电脑上已经安装好了以上三个库。可以使用以下命令来安装:

pip install torch
pip install torchvision
pip install matplotlib

获取数据集

在PyTorch中,可以很方便地获取MNIST数据集。代码如下:

import torch
import torchvision
import torchvision.transforms as transforms

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

trainset = torchvision.datasets.MNIST(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.MNIST(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
                                         shuffle=False, num_workers=2)

我们首先定义了一个transform对象,用于将数据集转换为张量,并进行归一化处理。接着我们使用torchvision.datasets.MNIST()函数来获取训练集和测试集,其中包括了下载、转换等操作,并使用torch.utils.data.DataLoader()将数据集分成batch,方便模型训练时的批量处理。

构建神经网络

PyTorch中构建神经网络一般分为两个部分。首先需要定义一个继承自torch.nn.Module的类,该类提供了神经网络的整体结构。然后需要定义一个继承自torch.nn.Module的类,该类提供了神经网络的整体结构。

下面给出一个基本的MNIST分类模型例子,仅包含了一个全连接层:

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 10)

    def forward(self, x):
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        return F.log_softmax(x, dim=1)

在__init__()函数中定义了一个全连接层,其中输入是28*28的像素矢量,输出是10个类别,即0~9。在forward()函数中,我们将数据展开成一维,然后使用全连接层,最后使用log_softmax()进行输出。

训练神经网络

将前面的数据集和神经网络结构传入下面的代码来训练模型:

import torch.optim as optim

net = Net()

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

for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data

        optimizer.zero_grad()

        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

代码中,我们首先定义了一个网络对象net。然后定义了一个损失函数criterion和优化器optimizer,使用nn.CrossEntropyLoss()作为损失函数,使用optim.SGD()作为优化器。接着使用for循环来进行多次epoch的训练,每次训练时将数据分批处理,并通过.net(inputs)函数得到模型的输出,使用损失函数计算损失并进行反向传播和参数更新。

测试神经网络

我们可以使用以下代码来测试训练好的神经网络:

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

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

该代码通过遍历测试集,并将结果与真实标签进行比较,得出神经网络的准确率。

示例说明

下面我们通过两条示例说明MNIST分类任务的实现:

示例一

在上一篇博客《PyTorch中的神经网络FashionMNIST分类任务》中,我们讲解了如何使用这个框架实现FashionMNIST分类任务。在这个示例中,我们将很快理解很多东西是如何使用的。我们将使用一个全连接层来定义网络结构。以下代码展示了如何定义模型。

import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
  def __init__(self):
    super(Net, self).__init__()
    self.fc1 = nn.Linear(28 * 28, 10)

  def forward(self, x):
    x = x.view(-1, 28 * 28)
    x = self.fc1(x)
    x = F.log_softmax(x, dim=1)
    return x

我们接下来需要使用数据加载器来导入FashionMNIST数据集。使用以下代码。

import torch
import torchvision
import torchvision.transforms as transforms

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

trainset = torchvision.datasets.FashionMNIST(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.FashionMNIST(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
                                         shuffle=False, num_workers=2)
classes = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
           'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

我们将使用SGD作为优化器和交叉熵损失函数。在PyTorch中,实现该任务非常容易。使用以下代码即可。

import torch.optim as optim

net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)

if __name__ == '__main__':
  for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
      inputs, labels = data
      optimizer.zero_grad()
      outputs = net(inputs)
      loss = criterion(outputs, labels)
      loss.backward()
      optimizer.step()
      running_loss += loss.item()
      if i % 200 == 199:    
        print('[%d, %5d] loss: %.3f' %
              (epoch + 1, i + 1, running_loss / 200))
        running_loss = 0.0

使用以下代码来保存神经网络的模型参数:

PATH = './fashion_mnist_net.pth'
torch.save(net.state_dict(), PATH)

接下来,我们可以使用以下代码在测试集上测试训练好的神经网络:

correct = 0
total = 0
with torch.no_grad():
  for data in testloader:
    images, labels = data
    outputs = net(images)
    _, predicted = torch.max(outputs.data, 1)
    total += labels.size(0)
    correct += (predicted == labels).sum().item()

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

示例二

在这个例子中,我们将使用卷积神经网络(CNN)来解决MNIST分类问题。在以下代码中,我们定义了一个简单的卷积神经网络,其中包括两个卷积层和两个全连接层:

import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
  def __init__(self):
    super(Net, self).__init__()
    self.conv1 = nn.Conv2d(1, 32, 3, 1)
    self.conv2 = nn.Conv2d(32, 64, 3, 1)
    self.dropout1 = nn.Dropout2d(0.25)
    self.dropout2 = nn.Dropout2d(0.5)
    self.fc1 = nn.Linear(9216, 128)
    self.fc2 = nn.Linear(128, 10)

  def forward(self, x):
    x = self.conv1(x)
    x = F.relu(x)
    x = self.conv2(x)
    x = F.relu(x)
    x = F.max_pool2d(x, 2)
    x = self.dropout1(x)
    x = torch.flatten(x, 1)
    x = self.fc1(x)
    x = F.relu(x)
    x = self.dropout2(x)
    x = self.fc2(x)
    output = F.log_softmax(x, dim=1)
    return output

我们使用以下代码定义损失函数和优化器:

import torch.optim as optim

net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adadelta(net.parameters(), lr=1.0)

下面是训练代码:

if __name__ == '__main__':
  for epoch in range(1, 15):
    train_loss, correct, total = 0, 0, 0
    net.train()
    for batch_idx, (data, target) in enumerate(trainloader):
      optimizer.zero_grad()
      output = net(data)
      loss = criterion(output, target)
      loss.backward()
      optimizer.step()
      train_loss += loss.item()
      _, predicted = torch.max(output.data, 1)
      total += target.size(0)
      correct += (predicted == target).sum().item()
      if batch_idx % 100 == 0:
        print('Train Epoch: {} [{}/{} ({:.0f}%)] Loss: {:.6f} Acc: {:.6f}'.format(
          epoch, batch_idx * len(data), len(trainloader.dataset),
          100. * batch_idx / len(trainloader), train_loss/(batch_idx+1), 100.*correct/total))

使用以下代码在测试集上测试训练好的神经网络:

correct, total = 0, 0
net.eval()
with torch.no_grad():
    for batch_idx, (data, target) in enumerate(testloader):
        output = net(data)
        _, predicted = torch.max(output.data, 1)
        total += target.size(0)
        correct += (predicted == target).sum().item()
    print('Test Acc: {:.6f}'.format(100.*correct/total))

这里我们使用Adadelta作为优化器,并在训练中使用了torch.no_grad()函数,以便在计算准确率时不会计算梯度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch中的神经网络 Mnist 分类任务 - Python技术站

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

相关文章

  • JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序

    JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序 简介 本攻略将教你如何编写Javascript代码来验证汽车车架号,这个代码可以用于网站、应用程序、汽车销售平台等。我们将创建一个基于Javascript的车架号验证函数,这个函数将按照汽车车架号的算法进行验证,来判断输入的车架号是否合法。 车架号结构和算法 汽车车架号是一串由17位组成的字符…

    人工智能概论 2023年5月25日
    00
  • spring boot微服务自定义starter原理详解

    让我来详细讲解“spring boot微服务自定义starter原理详解”的完整攻略。 什么是Spring Boot Starter? Spring Boot Starter是Spring Boot框架中的一个重要的概念,它是一种经过打包的可复用的组件,可用于扩展Spring Boot应用程序的功能。通常,Starter是一组依赖项,使得在启用该Starte…

    人工智能概览 2023年5月25日
    00
  • MongoDB.NET 2.2.4驱动版本对Mongodb3.3数据库中GridFS增删改查

    MongoDB.NET是针对MongoDB的官方.NET驱动,对于3.3版本的Mongodb数据库中的GridFS(分块存储)部分,官方也已经提供了对应的驱动版本——MongoDB.NET 2.2.4。在这里,我们将为大家详细讲解如何使用该驱动版本对Mongodb3.3数据库中GridFS进行增删改查操作。 安装MongoDB.NET驱动 首先,需要在项目中…

    人工智能概论 2023年5月25日
    00
  • Python 利用OpenCV给照片换底色的示例代码

    首先,为了实现给照片换底色,我们需要使用到 Python 图像处理库——OpenCV。接下来,让我们分步骤讲解实现过程: 步骤一:安装OpenCV 在命令行中输入以下命令: pip install opencv-python 步骤二:导入库并读取图片 import cv2 # 读取原图 img = cv2.imread(‘your_image.jpg’) 步…

    人工智能概览 2023年5月25日
    00
  • Selenium启动Chrome时配置选项详解

    下面是“Selenium启动Chrome时配置选项详解”的完整攻略。 一、前言 在使用Selenium进行自动化测试的时候,启动WebDriver时需要添加一系列配置选项。其中,配置Chrome参数是一项比较需要注意的地方。本文将详细讲解Selenium启动Chrome时配置选项的定义、使用方法及参数含义。 二、Chrome配置选项详解 1. ChromeO…

    人工智能概览 2023年5月25日
    00
  • python中的三种注释方法

    当写Python代码时,我们需要在一些片段代码和特定表达式旁边添加一些注释。注释不会执行,而是为了方便代码的阅读和理解。Python提供了三种注释代码的方法。 单行注释 单行注释以井号(#)开始,直到行结束。单行注释通常在新行中独立写,也可以出现在代码行的后面。单行注释只针对一行代码进行注释。例如: # 这是一行单行注释 print("Hello,…

    人工智能概览 2023年5月25日
    00
  • nginx配置虚拟主机vhost的方法详解

    以下是“nginx配置虚拟主机vhost的方法详解”的攻略: 1. 准备 在开始配置虚拟主机之前,请确保您已经安装了Nginx Web服务器,并且熟悉Nginx的基本配置和语法。 2. 创建一个虚拟主机配置文件 在Nginx的配置文件夹中创建一个虚拟主机配置文件。文件名应该以”.conf”结尾,并且应该在文件名中包含您的虚拟主机名。 示例1:创建一个名为”e…

    人工智能概览 2023年5月25日
    00
  • Django 框架模型操作入门教程

    下面我将为您详细讲解“Django 框架模型操作入门教程”的完整攻略,包括以下内容: Django 模型是什么 Django 模型的创建与编辑 Django 模型的属性与方法 查询 Django 模型数据的相关方法 两个示例说明 1. Django 模型是什么 Django 模型是一种用于定义数据结构的方式,可以帮助开发者快速构建数据库和表格。在 Djang…

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