如何使用PyTorch实现MNIST手写体识别

  介绍

这篇文章将为大家详细讲解有关如何使用PyTorch实现MNIST手写体识别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强>实验环境

win10 +水蟒+ jupyter笔记本

Pytorch2.1.0 Python3.7

gpu环境(可选)

<强> MNIST数据集介绍

MNIST包括6万张28 x28的训练样本,1万张测试样本,可以说是简历里的“你好"。本文使用的CNN网络将MNIST数据的识别率提高到99%了。下面我们就开始进行实战。

<>强导入包

import 火炬   import  torch.nn  as 神经网络   import  torch.nn.functional  as  F   import  torch.optim  as  optim   得到torchvision  import 数据集转换   火炬。__version__

<>强定义超参数

BATCH_SIZE=512   时代=20,   DEVICE =, torch.device (“cuda", if  torch.cuda.is_available (), else “cpu")

<强>数据集

我们直接使用PyTorch中自带的数据集,并使用DataLoader对训练数据和测试数据分别进行读取。如果下载过数据集这里下载可选择假

train_loader =, torch.utils.data.DataLoader (   ,,,datasets.MNIST(& # 39;数据# 39;,,火车=True,,下载=True,,   ,,,,,,,,,,,变换=transforms.Compose ([   ,,,,,,,,,,,,,transforms.ToTensor (),   ,,,,,,,,,,,,,transforms.Normalize ((0.1307), (0.3081))   ,,,,,,,,,,,))),   ,,,batch_size=batch_size,洗牌=True)      时间=test_loader  torch.utils.data.DataLoader (   ,,,datasets.MNIST(& # 39;数据# 39;,,火车=False,变换=transforms.Compose ([   ,,,,,,,,,,,,,transforms.ToTensor (),   ,,,,,,,,,,,,,transforms.Normalize ((0.1307), (0.3081))   ,,,,,,,,,,,))),   ,,,batch_size=batch_size,洗牌=True)

<强>定义网络

该网络包括两个卷积层和两个线性层,最后输出10个维度,即代表0 - 9十个数字。

class 事先(nn.Module):   def 才能__init__(自我):   ,,,超级(). __init__ ()   ,,,self.conv1=nn.Conv2d(1、10、5), #,输入:(1,28日28),输出:(24)10日,24日,   ,,,self.conv2=nn.Conv2d(10年,20年,3),#,输入:(10、12、12),输出:(20、10、10)   ,,,self.fc1 =, nn.Linear (20 * 10 * 10500)   ,,,self.fc2 =, nn.Linear(500年,10)   def 才能向前(自我,x):   ,,,in_size =, x.size (0)   ,,,out =, self.conv1 (x)   ,,,out =, F.relu(出)   ,,,out =, F.max_pool2d (,, 2,, 2),   ,,,out =, self.conv2(出)   ,,,out =, F.relu(出)   ,,,out =, out.view (in_size, 1)   ,,,out =, self.fc1(出)   ,,,out =, F.relu(出)   ,,,out =, self.fc2(出)   ,,,out =, F.log_softmax(,昏暗的=1)   ,,,return 从

<强>实例化网络

model =,事先(),(设备),#,将网络移动到gpu上   optimizer =, optim.Adam (model.parameters()), #,使用亚当优化器

<强>定义训练函数

def 培训(设备模型,还以为,train_loader,优化器,,时代):   model.train才能()   for 才能;batch_idx,(数据,目标),拷贝列举(train_loader):   数据,,,,,target =, data.to(设备),target.to(设备)   ,,,optimizer.zero_grad ()   ,,,output =,模型(数据)   ,,,loss =, F.nll_loss(输出,目标)   ,,,loss.backward ()   ,,,optimizer.step ()   ,,,如果(batch_idx + 1) % 30,==, 0:,   ,,,,,print (& # 39; Train 时代:{},({}/{},({:.0f} %)] \ tLoss:, {: .6f} & # 39; .format (   ,,,,,,,时代,,batch_idx  *, len(数据),len (train_loader.dataset),   ,,,,,,,100只*,batch_idx /, len (train_loader), loss.item ()))

<强>定义测试函数

def 测试(模型,设备,test_loader):   model.eval才能()   test_loss 才能=0   correct 才能=0   with 才能torch.no_grad ():   ,,,for 数据,target 拷贝test_loader:   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何使用PyTorch实现MNIST手写体识别