Pytorch——MNIST手写数字识别0

运行代码1为:

import numpy as np
from torch.nn import Module
from torch.utils.data import DataLoader
from torchvision.datasets import MNIST
from matplotlib import pyplot as plt
import torch
import torch.nn as nn
import torchvision
from tqdm import tqdm

mnist = MNIST(root='~', train=True, download=True)

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

trainData = torchvision.datasets.MNIST(root='~', train=True, transform=trans, download=True)
testData = torchvision.datasets.MNIST(root='~', train=False, transform=trans, download=True)
trainDataLoader = DataLoader(dataset=trainData, batch_size=16, shuffle=True)
testDataLoader = DataLoader(dataset=testData, batch_size=16, shuffle=True)


class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.inputlayer = nn.Sequential(nn.Linear(28 * 28, 256), nn.ReLU(), nn.Dropout(0.2))
        self.hiddenlayer = nn.Sequential(nn.Linear(256, 256), nn.ReLU(), nn.Dropout(0.2))
        self.outlayer = nn.Sequential(nn.Linear(256, 10))

    def forward(self, x):
        x = x.view(x.size(0), -1)
        x = self.inputlayer(x)
        x = self.hiddenlayer(x)
        x = self.outlayer(x)
        return x


model = Model()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
celoss = nn.CrossEntropyLoss()
best_acc = 0
correct = 0
loss_all = {'train': [], 'Test ': []}
for epoch in tqdm(range(3)):
    processBar = tqdm(trainDataLoader, unit='step')
    model.eval()
    numer_val, denumer_val, loss_tr = 0., 0., 0.
    with torch.no_grad():
        for data, targe in testDataLoader:
            output = model(data)
            loss = celoss(output, targe)
            loss_tr += loss.data

    model.train()
    loss_train = 0.
    for imag, labels in trainDataLoader:
        optimizer.zero_grad()
        output = model(data)
        loss = celoss(output, labels)
        loss_train += loss.data
        loss.backward()
        optimizer.step()

    loss_all['train'].append(loss_tr / len(trainDataLoader))
    loss_all['Test '].append(loss_train / len(testDataLoader))
plt.plot(loss_all['train'])
plt.plot(loss_all['Test '])
plt.show()

运行结果:

网上有文章讲述的特别好,代码也比这个高级很多,详情:https://blog.csdn.net/NikkiElwin/article/details/112980305

运行代码2

import torch
import torch.nn as nn
import torch.nn.functional as functional
import torchvision
import torchvision.transforms as transforms
from torchvision.datasets import MNIST
from PIL import Image
from copy import deepcopy
import matplotlib.pyplot as plt
import numpy as np
from torch.utils.data import DataLoader

mnist_data = MNIST(root='~', train=True, download=True)  # 图片的shape是1*28*28


# print(mnist_data[0][0])

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 20, 5, 1)
        # torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1)
        # in_channels:输入图像通道数,手写数字图像为1,彩色图像为3
        # out_channels:输出通道数,这个等于卷积核的数量
        # kernel_size:卷积核大小
        # stride:步长
        self.conv2 = nn.Conv2d(20, 50, 5, 1)
        self.fc1 = nn.Linear(4 * 4 * 50, 500)
        self.fc2 = nn.Linear(500, 10)
        # 最后一个全连接层的输出维度必须是分类的类数,所以是10

    def forward(self, x):
        x = functional.relu(self.conv1(x))  # 变成20*24*24(24=28+1-5)
        x = functional.max_pool2d(x, 2, 2)  # 变成20*12*12
        x = functional.relu(self.conv2(x))  # 变成50*8*8
        x = functional.max_pool2d(x, 2, 2)  # 变成50*4*4
        x = x.view(-1, 4 * 4 * 50)
#注意一点,在输入到全连接层之前,需要将其从一个三维的张量转换成一个一维张量,用到view()
        x = functional.relu(self.fc1(x))
        x = self.fc2(x)
        return functional.log_softmax(x, dim=1)


device = torch.device('cuda' if torch.cuda.is_available() else "cpu")
trans = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
batch_size = 32
train_dataloder = DataLoader(
    MNIST(root='~', train=True, download=True, transform=trans) ,batch_size=batch_size, shuffle=True)
test_dataloder = DataLoader(
    MNIST(root='~', train=False, download=True, transform=trans), batch_size=batch_size, shuffle=True)

lr = 0.01
momentum = 0.5
model = Net().to(device)  # 模型初始化
optimizer = torch.optim.SGD(model.parameters(), lr=lr, momentum=momentum)  # 定义优化器
for epoch in range(10):
    model.train()
    for batch_idx, (data, target) in enumerate(train_dataloder):
        data, target = data.to(device), target.to(device)
        pred = model(data)
        loss = functional.nll_loss(pred, target)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if batch_idx % 100 == 0:
            print("Train Epoch: {} [{}/{} ({:0f}%)]\tLoss: {:.6f}".format(
                epoch,
                batch_idx * len(data),  # 100*32
                len(train_dataloder.dataset),  # 60000
                100. * batch_idx / len(train_dataloder),  # len(train_loader)=60000/32=1875
                loss.item()
            ))
    model.eval()
    total_loss=0.
    correct=0.
    with torch.no_grad():
        for data, target in test_dataloder:
            data, target = data.to(device), target.to(device)
            output = model(data)
            pred = model(data).argmax(dim=1)#找出最高的那个,就是预测的结果
            total_loss+= functional.nll_loss(output, target,reduction='sum').item()
            correct+=pred.eq(target.view_as(pred)).sum().item()
            total_loss /= len(test_dataloder.dataset)
            print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
                total_loss, correct, len(test_dataloder.dataset),
                100. * correct / len(test_dataloder.dataset)))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch是一种深度学习框架,可以用来实现MNIST手写数字识别MNIST是一个常用的数据集,包含了大量手写数字的图像和对应的标签。我们可以使用PyTorch来构建一个卷积神经网络模型,对这些图像进行分类,从而实现手写数字识别的功能。具体实现过程可以参考PyTorch官方文档或相关教程。 ### 回答2: MNIST是一个经典的手写数字识别问题,其数据集包括60,000个训练样本和10,000个测试样本。PyTorch作为深度学习领域的热门工具,也可以用来实现MNIST手写数字识别。 第一步是加载MNIST数据集,可以使用PyTorch的torchvision.datasets模块实现。需要注意的是,MNIST数据集是灰度图像,需要将其转换为标准的三通道RGB图像。 ```python import torch import torchvision import torchvision.transforms as transforms # 加载数据集 train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]), download=True) test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]), download=True) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False) ``` 第二步是构建模型。在MNIST手写数字识别问题中,可以选择使用卷积神经网络(CNN),其可以捕获图像中的局部特征,这对于手写数字识别非常有用。 ```python 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, kernel_size=3) self.conv2 = nn.Conv2d(32, 64, kernel_size=3) self.dropout1 = nn.Dropout2d(0.25) self.dropout2 = nn.Dropout2d(0.5) self.fc1 = nn.Linear(64*12*12, 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, kernel_size=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 model = Net() ``` 第三步是定义优化器和损失函数,并进行训练和测试。在PyTorch中,可以选择使用交叉熵损失函数和随机梯度下降(SGD)优化器进行训练。 ```python import torch.optim as optim # 定义优化器和损失函数 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) # 训练模型 for epoch in range(10): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data optimizer.zero_grad() outputs = model(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 # 测试模型 correct = 0 total = 0 with torch.no_grad(): for data in test_loader: images, labels = data outputs = model(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)) ``` 最后,可以输出测试集上的准确率。对于这个模型,可以得到大约98%的准确率,具有很好的性能。 ### 回答3: PyTorch是一个常用的深度学习框架,通过PyTorch可以方便地实现mnist手写数字识别mnist手写数字数据集是机器学习领域的一个经典数据集,用于训练和测试数字识别算法模型。以下是PyTorch实现mnist手写数字识别的步骤: 1. 获取mnist数据集:可以通过PyTorch提供的工具包torchvision来获取mnist数据集。 2. 数据预处理:将数据集中的手写数字图片转换为张量,然后进行标准化处理,使得每个像素值都在0到1之间。 3. 构建模型:可以使用PyTorch提供的nn模块构建模型,常用的模型包括卷积神经网络(CNN)和全连接神经网络(FNN)。例如,可以使用nn.Sequential()函数将多个层逐一堆叠起来,形成一个模型。 4. 训练模型:通过定义损失函数和优化器,使用训练数据集对模型进行训练。常用的损失函数包括交叉熵损失函数和均方误差损失函数,常用的优化器包括随机梯度下降(SGD)和Adam。 5. 测试模型:通过测试数据集对模型进行测试,可以用测试准确率来评估模型的性能。 以下是一个简单的PyTorch实现mnist手写数字识别的代码: ``` python import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as transforms # 获取数据集 train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor()) # 数据加载器 train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True) test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False) # 构建模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=5) self.conv2 = nn.Conv2d(32, 64, kernel_size=5) self.fc1 = nn.Linear(1024, 256) self.fc2 = nn.Linear(256, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = F.max_pool2d(x, 2) x = F.relu(self.conv2(x)) x = F.max_pool2d(x, 2) x = x.view(-1, 1024) x = F.relu(self.fc1(x)) x = self.fc2(x) return F.log_softmax(x, dim=1) model = Net() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 训练模型 num_epochs = 10 for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # 转换为模型所需格式 images = images.float() labels = labels.long() # 前向传播和计算损失 outputs = model(images) loss = criterion(outputs, labels) # 反向传播和更新参数 optimizer.zero_grad() loss.backward() optimizer.step() # 每100个批次输出一次日志 if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_dataset)//100, loss.item())) # 测试模型 correct = 0 total = 0 with torch.no_grad(): # 不需要计算梯度 for images, labels in test_loader: # 转换为模型所需格式 images = images.float() labels = labels.long() # 前向传播 outputs = model(images) _, predicted = torch.max(outputs.data, 1) # 统计预测正确数和总数 total += labels.size(0) correct += (predicted == labels).sum().item() print('Test Accuracy: {:.2f}%'.format(100 * correct / total)) ``` 以上就是一个基于PyTorchmnist手写数字识别的简单实现方法。需要注意的是,模型的设计和训练过程可能会受到多种因素的影响,例如网络结构、参数初始化、优化器等,需要根据实际情况进行调整和优化,才能达到更好的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值