介绍
这篇文章将为大家详细讲解有关如何使用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手写体识别