1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MNIST手写体数字识别数据集

MNIST手写体数字识别数据集

时间:2020-05-25 16:57:09

相关推荐

MNIST手写体数字识别数据集

一、总体介绍

1.1 什么是机器识别手写数字?

1.2 MNIST数据集是什么?

(1)该数据集包含60,000个用于训练的示例和10,000个用于测试的示例。

(2)数据集包含了0-9共10类手写数字图片,每张图片都做了尺寸归一化,都是28x28大小的灰度图。

(3)MNIST数据集包含四个部分:

训练集图像:train-images-idx3-ubyte.gz(9.9MB,包含60000个样本)

训练集标签:train-labels-idx1-ubyte.gz(29KB,包含60000个标签)

测试集图像:t10k-images-idx3-ubyte.gz(1.6MB,包含10000个样本)

测试集标签:t10k-labels-idx1-ubyte.gz(5KB,包含10000个标签)

下载地址MNIST

1.3 手写字体的识别流程

( 1)定义超参数;

(2〉构建transforms,主要是对图像做变换;

(3)下载、加载数据集MNIST;

(4)构建网络模型;

(5)定义训练方法;

(6)定义测试方法;

(7)开始训练模型,输出预测结果;

二、代码实现

2.1 导入相应的库

# 1 加载必要的库import torchimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optimfrom torchvision import datasets,transforms

2.2 定义超参数

# 2 定义超参数BATCH_SIZE = 16 # 每批处理的数据DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 是否用GPU还是CPU训练EPOCHS = 10 # 训练数据集的轮次

2.3 构建pipeline,对图像做处理

# 3 构建pipeline,对图像做处理pipeline = pose([transforms.ToTensor(),# 将图片转换成tensortransforms.Normalize((0.1307,),(0.3081,)) # 正则化降低模型复杂度])

2.4 下载、加载数据

# 4 下载、加载数据from torch.utils.data import DataLoader# 下载数据集train_set = datasets.MNIST("data", train=True, download=False, transform=pipeline)test_set = datasets.MNIST("data", train=False, download=False, transform=pipeline)# 加载数据train_loader = DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True) # 顺序打乱shuffle=Truetest_loader = DataLoader(test_set, batch_size=BATCH_SIZE, shuffle=True)

2.5 查看一下数据集图片(可跳过)

## 插入代码,显示MNIST中的图片with open("./data/MNIST/raw/train-images-idx3-ubyte","rb") as f:file = f.read()

imagel = [int(str(item).encode('ascii'),16) for item in file[16 : 16+784]]print(imagel)

import cv2import numpy as npimagel_np = np.array(imagel, dtype=np.uint8).reshape(28, 28, 1)print(imagel_np.shape)

cv2.imwrite("gigit.jpg", imagel_np)

2.6 构建网络模型

# 5 构建网络模型class Digit(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 10, 5) # 1:灰度图片的通道, 10:输出通道, 5:kernel 5x5self.conv2 = nn.Conv2d(10, 20, 3) # 10:输入通道, 20:输出通道, 3:kernel 3x3self.fc1 = nn.Linear(20*10*10, 500) # 20*10*10:输入通道, 500:输出通道self.fc2 = nn.Linear(500, 10) # 500:输入通道, 10:输出通道#前向传播def forward(self, x):input_size = x.size(0) # batch_sizex = self.conv1(x) # 输入:batch*1*28*28, 输出:batch*10*24*24 (28 - 5 + 1 = 24)x = F.relu(x) # 激活函数,保持shape不变, 输出batch*10*24*24x = F.max_pool2d(x, 2, 2) # 输入:batch*10*24*24 输出:batch*10*12*12x = self.conv2(x) # 输入:batch*10*12*12, 输出:batch*20*10*10 (12 - 3 + 1 = 10)x = F.relu(x)x = x.view(input_size, -1) # 拉平, -1 自动计算维度,20*10*10 = 2000x = self.fc1(x) # 输入:batch*2000,输出:batch*500x = F.relu(x)x = self.fc2(x) # 输入:batch*500,输出:batch*10output = F.log_softmax(x, dim=1) # 计算分类后,每个数字的概率值return output

2.6 定义优化器(更新参数,是训练测试结果达到最优值)

model = Digit().to(DEVICE)optimizer = optim.Adam(model.parameters())

2.7 定义训练方法

# 7 定义训练方法def train_model(model, device, train_loader, optimizer, epoch):# 模型训练model.train()for batch_index, (data, target) in enumerate(train_loader):# 部署到DEVICE上去data, target = data.to(device), target.to(device)# 梯度初始化为0optimizer.zero_grad()# 训练后的结果output = model(data)# 计算损失loss = F.cross_entropy(output, target) # 交叉熵用于分类比较多的情况# 反向传播loss.backward()# 参数优化optimizer.step()if batch_index % 3000 == 0:print("Train Epoch : {} \t Loss : {:.6f}".format(epoch, loss.item()))

2.8 定义测试方法

# 8 定义测试方法def test_model(model, device, test_loader):# 模型验证model.eval()# 正确率correct = 0.0# 测试损失test_loss = 0.0with torch.no_grad(): # 不会计算梯度,也不会反向传播for data, target in test_loader:# 部署到device上data, target = data.to(device), target.to(device)# 测试数据output = model(data)# 计算测试损失test_loss += F.cross_entropy(output, target).item()# 找到概率值最大的下标pred = output.max(1, keepdim=True)[1] # 值,索引# pred = torch.max(output, dim=1)# pred = output.argmax(dim=1)#累计正确的值correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)print("Test — Average loss : {:.4f}, Accuracy : {:.3f}\n".format(test_loss, 100.0 * correct / len(test_loader.dataset)))

2.9 调用 方法7 / 8

# 9 调用 方法7 / 8for epoch in range(1, EPOCHS +1):train_model(model, DEVICE, train_loader, optimizer, epoch)test_model(model, DEVICE, test_loader)

2.10 结果

三、总结

本文观看b站的“唐国梁Tommy”up主的轻松学 PyTorch 手写字体识别 MNIST,讲解十分详细,推荐观看。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。