Giter Club home page Giter Club logo

nt-test's Introduction

MNIST 手写识别程序

一、MLP实现

当然,下面是对上面提供的PyTorch MLP实现MNIST手写识别代码的详细解释:

1. 导入必要的库

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

这里导入了PyTorch库,包括神经网络模块torch.nn,函数库torch.nn.functional,以及用于数据加载和预处理的torchvision库和DataLoader

2. 数据预处理

transform = transforms.Compose([
    transforms.ToTensor(),  # 将PIL图像或NumPy `ndarray`转换成`FloatTensor`
    transforms.Normalize((0.5,), (0.5,))  # 将数据标准化到 [-1, 1] 范围
])

这里定义了一个转换操作的组合,首先将图像转换为PyTorch张量,然后进行标准化处理,使像素值范围从0到1映射到-1到1。

3. 加载数据集

trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=64, shuffle=True)

testset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=False, transform=transform)
testloader = DataLoader(testset, batch_size=64, shuffle=False)

使用datasets.MNIST类加载MNIST数据集,如果本地不存在则自动下载。DataLoader用于创建一个迭代器,它可以在训练或测试时按批次加载数据。

4. 定义MLP模型

class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.fc1 = nn.Linear(784, 512)  # 第一个全连接层,输入为784维(28x28像素的图像展平),输出为512维
        self.fc2 = nn.Linear(512, 256)  # 第二个全连接层,输出为256维
        self.fc3 = nn.Linear(256, 10)   # 第三个全连接层,输出为10维(代表10个类别)

    def forward(self, x):
        x = x.view(-1, 784)  # 将图像转换为一维数据,以适配全连接层
        x = F.relu(self.fc1(x))  # 激活函数,ReLU
        x = F.relu(self.fc2(x))
        x = self.fc3(x)  # 最后的输出层不使用激活函数,因为我们需要原始分数进行分类
        return x

这里定义了一个简单的MLP模型,包含三个全连接层。forward方法定义了数据通过网络的正向传播过程。

5. 选择损失函数和优化器

criterion = nn.CrossEntropyLoss()  # 交叉熵损失,适用于分类问题
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # Adam优化器

损失函数用于评估模型的预测值和真实值之间的差异,优化器用于更新网络的权重以减少这种差异。

6. 训练模型

epochs = 5  # 训练的轮数
for epoch in range(epochs):
    # 训练过程...

在每个epoch中,模型都会遍历整个训练集,通过前向传播得到预测结果,计算损失,然后通过反向传播更新权重。

7. 测试模型性能

def test(model, testloader):
    # 测试过程...
    return accuracy

在测试阶段,模型在测试集上运行,不进行权重更新。计算并返回测试准确度。

8. 运行训练和测试

最后,代码运行训练过程,并在测试集上评估模型性能。

accuracy = test(model, testloader)
print(f'Test Accuracy: {accuracy:.2f}%')

打印出测试集上的准确度百分比。

确保在运行此代码之前,你已经安装了PyTorch和torchvision,并且你的环境中有适当的Python环境。此外,由于MNIST数据集会被自动下载,确保你的网络连接正常。

二、CNN实现

当然,下面是对使用PyTorch实现的CNN模型进行MNIST手写数字识别的详细说明:

1. 导入必要的库

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

这里导入了PyTorch库的核心模块,包括用于构建神经网络的torch.nn,用于激活函数的torch.nn.functional,以及用于数据加载和预处理的torchvision库和DataLoader

2. 数据预处理

transform = transforms.Compose([
    transforms.ToTensor(),  # 将PIL图像或NumPy ndarray转换成torch.Tensor
    transforms.Normalize((0.1307,), (0.3081,))  # 根据MNIST数据集的均值和标准差进行标准化
])

这里定义了一个转换操作的组合,首先将图像转换为PyTorch张量,然后进行标准化处理。

3. 加载数据集

trainset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=64, shuffle=True)

testset = datasets.MNIST('~/.pytorch/MNIST_data/', download=True, train=False, transform=transform)
testloader = DataLoader(testset, batch_size=64, shuffle=False)

使用datasets.MNIST类加载MNIST数据集,如果本地不存在则自动下载。DataLoader用于创建一个迭代器,它可以在训练或测试时按批次加载数据。

4. 定义CNN模型

class CNN(nn.Module):
    # 其余的类定义...

这里定义了一个CNN类,它是nn.Module的子类,用于构建卷积神经网络。

5. 选择损失函数和优化器

criterion = nn.CrossEntropyLoss()  # 交叉熵损失,适用于分类问题
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # Adam优化器

损失函数用于评估模型的预测值和真实值之间的差异,优化器用于更新网络的权重以减少这种差异。

6. 训练模型

epochs = 5  # 训练的轮数
for epoch in range(epochs):
    # 训练过程...

在每个epoch中,模型都会遍历整个训练集,执行前向传播、计算损失、执行反向传播并更新权重。

7. 测试模型性能

def test(model, testloader):
    # 测试过程...
    return accuracy

在测试阶段,模型在测试集上运行,不进行权重更新。计算并返回测试准确度。

8. 运行训练和测试

accuracy = test(model, testloader)
print(f'Test Accuracy: {accuracy:.2f}%')

打印出测试集上的准确度百分比。

CNN模型详解

在CNN模型中,我们定义了两个卷积层和两个池化层,然后是两个全连接层:

  • 第一个卷积层 conv1 使用32个3x3的卷积核。
  • 第一个池化层 pool1 使用2x2的最大池化核,步长为2。
  • 第二个卷积层 conv2 使用64个3x3的卷积核。
  • 第二个池化层 pool2 同样使用2x2的最大池化核,步长为2。

在经过两次卷积和池化之后,图像尺寸从28x28减少到7x7。每个卷积层的输出通道数分别是32和64,因此在进入第一个全连接层fc1之前,我们根据这个尺寸和通道数计算出全连接层的输入特征数,即64 * 7 * 7

第一个全连接层fc1将卷积层的输出映射到128维的空间,然后第二个全连接层fc2将这个128维的空间映射到10维,对应10个类别的输出。

forward方法中,我们定义了数据通过网络的正向传播过程。首先,数据通过卷积层和池化层,然后我们使用view方法将多维的输出展平为一维,以便输入到全连接层。最后,我们应用ReLU激活函数和输出层。

注意事项

  • 确保在运行此代码之前,你已经安装了PyTorch和torchvision。
  • 由于MNIST数据集会被自动下载,确保你的网络连接正常。
  • 根据你的硬件配置,可能需要调整batch_size以避免内存溢出错误。

运行上述代码,你将能够训练一个CNN模型来识别MNIST手写数字,并且在测试集上得到模型的准确度。

nt-test's People

Contributors

bjliudong avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.