时间:2021-05-22
实验环境
win10 + anaconda + jupyter notebook
Pytorch1.1.0
Python3.7
gpu环境(可选)
MNIST数据集介绍
MNIST 包括6万张28x28的训练样本,1万张测试样本,可以说是CV里的“Hello Word”。本文使用的CNN网络将MNIST数据的识别率提高到了99%。下面我们就开始进行实战。
导入包
import torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimfrom torchvision import datasets, transformstorch.__version__定义超参数
BATCH_SIZE=512EPOCHS=20 DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")数据集
我们直接使用PyTorch中自带的dataset,并使用DataLoader对训练数据和测试数据分别进行读取。如果下载过数据集这里download可选择False
train_loader = torch.utils.data.DataLoader( datasets.MNIST('data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=BATCH_SIZE, shuffle=True)test_loader = torch.utils.data.DataLoader( datasets.MNIST('data', train=False, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=BATCH_SIZE, shuffle=True)定义网络
该网络包括两个卷积层和两个线性层,最后输出10个维度,即代表0-9十个数字。
class ConvNet(nn.Module): def __init__(self): super().__init__() self.conv1=nn.Conv2d(1,10,5) # input:(1,28,28) output:(10,24,24) self.conv2=nn.Conv2d(10,20,3) # input:(10,12,12) output:(20,10,10) self.fc1 = nn.Linear(20*10*10,500) self.fc2 = nn.Linear(500,10) def forward(self,x): in_size = x.size(0) out = self.conv1(x) out = F.relu(out) out = F.max_pool2d(out, 2, 2) out = self.conv2(out) out = F.relu(out) out = out.view(in_size,-1) out = self.fc1(out) out = F.relu(out) out = self.fc2(out) out = F.log_softmax(out,dim=1) return out实例化网络
model = ConvNet().to(DEVICE) # 将网络移动到gpu上optimizer = optim.Adam(model.parameters()) # 使用Adam优化器定义训练函数
def train(model, device, train_loader, optimizer, epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = F.nll_loss(output, target) loss.backward() optimizer.step() if(batch_idx+1)%30 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item()))定义测试函数
def test(model, device, test_loader): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += F.nll_loss(output, target, reduction='sum').item() # 将一批的损失相加 pred = output.max(1, keepdim=True)[1] # 找到概率最大的下标 correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader.dataset) print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format( test_loss, correct, len(test_loader.dataset), 100. * correct / len(test_loader.dataset)))开始训练
for epoch in range(1, EPOCHS + 1): train(model, DEVICE, train_loader, optimizer, epoch) test(model, DEVICE, test_loader)实验结果
Train Epoch: 1 [14848/60000 (25%)] Loss: 0.375058Train Epoch: 1 [30208/60000 (50%)] Loss: 0.255248Train Epoch: 1 [45568/60000 (75%)] Loss: 0.128060Test set: Average loss: 0.0992, Accuracy: 9690/10000 (97%)Train Epoch: 2 [14848/60000 (25%)] Loss: 0.093066Train Epoch: 2 [30208/60000 (50%)] Loss: 0.087888Train Epoch: 2 [45568/60000 (75%)] Loss: 0.068078Test set: Average loss: 0.0599, Accuracy: 9816/10000 (98%)Train Epoch: 3 [14848/60000 (25%)] Loss: 0.043926Train Epoch: 3 [30208/60000 (50%)] Loss: 0.037321Train Epoch: 3 [45568/60000 (75%)] Loss: 0.068404Test set: Average loss: 0.0416, Accuracy: 9859/10000 (99%)Train Epoch: 4 [14848/60000 (25%)] Loss: 0.031654Train Epoch: 4 [30208/60000 (50%)] Loss: 0.041341Train Epoch: 4 [45568/60000 (75%)] Loss: 0.036493Test set: Average loss: 0.0361, Accuracy: 9873/10000 (99%)Train Epoch: 5 [14848/60000 (25%)] Loss: 0.027688Train Epoch: 5 [30208/60000 (50%)] Loss: 0.019488Train Epoch: 5 [45568/60000 (75%)] Loss: 0.018023Test set: Average loss: 0.0344, Accuracy: 9875/10000 (99%)Train Epoch: 6 [14848/60000 (25%)] Loss: 0.024212Train Epoch: 6 [30208/60000 (50%)] Loss: 0.018689Train Epoch: 6 [45568/60000 (75%)] Loss: 0.040412Test set: Average loss: 0.0350, Accuracy: 9879/10000 (99%)Train Epoch: 7 [14848/60000 (25%)] Loss: 0.030426Train Epoch: 7 [30208/60000 (50%)] Loss: 0.026939Train Epoch: 7 [45568/60000 (75%)] Loss: 0.010722Test set: Average loss: 0.0287, Accuracy: 9892/10000 (99%)Train Epoch: 8 [14848/60000 (25%)] Loss: 0.021109Train Epoch: 8 [30208/60000 (50%)] Loss: 0.034845Train Epoch: 8 [45568/60000 (75%)] Loss: 0.011223Test set: Average loss: 0.0299, Accuracy: 9904/10000 (99%)Train Epoch: 9 [14848/60000 (25%)] Loss: 0.011391Train Epoch: 9 [30208/60000 (50%)] Loss: 0.008091Train Epoch: 9 [45568/60000 (75%)] Loss: 0.039870Test set: Average loss: 0.0341, Accuracy: 9890/10000 (99%)Train Epoch: 10 [14848/60000 (25%)] Loss: 0.026813Train Epoch: 10 [30208/60000 (50%)] Loss: 0.011159Train Epoch: 10 [45568/60000 (75%)] Loss: 0.024884Test set: Average loss: 0.0286, Accuracy: 9901/10000 (99%)Train Epoch: 11 [14848/60000 (25%)] Loss: 0.006420Train Epoch: 11 [30208/60000 (50%)] Loss: 0.003641Train Epoch: 11 [45568/60000 (75%)] Loss: 0.003402Test set: Average loss: 0.0377, Accuracy: 9894/10000 (99%)Train Epoch: 12 [14848/60000 (25%)] Loss: 0.006866Train Epoch: 12 [30208/60000 (50%)] Loss: 0.012617Train Epoch: 12 [45568/60000 (75%)] Loss: 0.008548Test set: Average loss: 0.0311, Accuracy: 9908/10000 (99%)Train Epoch: 13 [14848/60000 (25%)] Loss: 0.010539Train Epoch: 13 [30208/60000 (50%)] Loss: 0.002952Train Epoch: 13 [45568/60000 (75%)] Loss: 0.002313Test set: Average loss: 0.0293, Accuracy: 9905/10000 (99%)Train Epoch: 14 [14848/60000 (25%)] Loss: 0.002100Train Epoch: 14 [30208/60000 (50%)] Loss: 0.000779Train Epoch: 14 [45568/60000 (75%)] Loss: 0.005952Test set: Average loss: 0.0335, Accuracy: 9897/10000 (99%)Train Epoch: 15 [14848/60000 (25%)] Loss: 0.006053Train Epoch: 15 [30208/60000 (50%)] Loss: 0.002559Train Epoch: 15 [45568/60000 (75%)] Loss: 0.002555Test set: Average loss: 0.0357, Accuracy: 9894/10000 (99%)Train Epoch: 16 [14848/60000 (25%)] Loss: 0.000895Train Epoch: 16 [30208/60000 (50%)] Loss: 0.004923Train Epoch: 16 [45568/60000 (75%)] Loss: 0.002339Test set: Average loss: 0.0400, Accuracy: 9893/10000 (99%)Train Epoch: 17 [14848/60000 (25%)] Loss: 0.004136Train Epoch: 17 [30208/60000 (50%)] Loss: 0.000927Train Epoch: 17 [45568/60000 (75%)] Loss: 0.002084Test set: Average loss: 0.0353, Accuracy: 9895/10000 (99%)Train Epoch: 18 [14848/60000 (25%)] Loss: 0.004508Train Epoch: 18 [30208/60000 (50%)] Loss: 0.001272Train Epoch: 18 [45568/60000 (75%)] Loss: 0.000543Test set: Average loss: 0.0380, Accuracy: 9894/10000 (99%)Train Epoch: 19 [14848/60000 (25%)] Loss: 0.001699Train Epoch: 19 [30208/60000 (50%)] Loss: 0.000661Train Epoch: 19 [45568/60000 (75%)] Loss: 0.000275Test set: Average loss: 0.0339, Accuracy: 9905/10000 (99%)Train Epoch: 20 [14848/60000 (25%)] Loss: 0.000441Train Epoch: 20 [30208/60000 (50%)] Loss: 0.000695Train Epoch: 20 [45568/60000 (75%)] Loss: 0.000467Test set: Average loss: 0.0396, Accuracy: 9894/10000 (99%)总结
一个实际项目的工作流程:找到数据集,对数据做预处理,定义我们的模型,调整超参数,测试训练,再通过训练结果对超参数进行调整或者对模型进行调整。
以上这篇使用PyTorch实现MNIST手写体识别代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了pytorch实现MNIST手写体识别的具体代码,供大家参考,具体内容如下实验环境pytorch1.4Windows10python3.7c
在前几天写的一篇博文《如何从TensorFlow的mnist数据集导出手写体数字图片》中,我们介绍了如何通过TensorFlow将mnist手写体数字集导出到本
MNIST是一个非常有名的手写体数字识别数据集,TensorFlow对MNIST数据集做了封装,可以直接调用。MNIST数据集包含了60000张图片作为训练数据
本文实例讲述了Pytorch实现的手写数字mnist识别功能。分享给大家供大家参考,具体如下:importtorchimporttorchvisionastvi
一,mnist数据集形如上图的数字手写体就是mnist数据集。二,GAN原理(生成对抗网络)GAN网络一共由两部分组成:一个是伪造器(Generator,简称G