minist手写文字数据集是深度学习/机器学习的入门集数据集。通过搭建深度神经网络的方法对minist数据集进行训练和预测,可以对整个深度学习的框架做一个大概的了解。
cpu 版本,即数据和模型都在cpu(内存)上训练,不需要调用gpu。

# 训练+测试import torch
import torch.nn as nn
import torch.utils.data as Data
import torchvision
import matplotlib.pyplot as plt
import os
import cv2torch.manual_seed(1)  # 使用随机化种子使神经网络的初始化每次都相同# 超参数
EPOCH = 10  # 训练整批数据的次数
BATCH_SIZE = 50
LR = 0.001  # 学习率
DOWNLOAD_MNIST = True  # 表示还没有下载数据集,如果数据集下载好了就写False# 用class类来建立CNN模型
# CNN流程:卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)->
#        卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)->
#        展平多维的卷积成的特征图->接入全连接层(Linear)->输出
class CNN(nn.Module):  # 我们建立的CNN继承nn.Module这个模块def __init__(self):super(CNN, self).__init__()# 建立第一个卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)self.conv1 = nn.Sequential(# 第一个卷积con2dnn.Conv2d(  # 输入图像大小(1,28,28)in_channels=1,  # 输入图片的高度,因为minist数据集是灰度图像只有一个通道out_channels=16,  # n_filters 卷积核的高度kernel_size=5,  # filter size 卷积核的大小 也就是长x宽=5x5stride=1,  # 步长padding=2,  # 想要con2d输出的图片长宽不变,就进行补零操作 padding = (kernel_size-1)/2),  # 输出图像大小(16,28,28)# 激活函数nn.ReLU(),# 池化,下采样nn.MaxPool2d(kernel_size=2),  # 在2x2空间下采样# 输出图像大小(16,14,14))# 建立第二个卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)self.conv2 = nn.Sequential(# 输入图像大小(16,14,14)nn.Conv2d(  # 也可以直接简化写成nn.Conv2d(16,32,5,1,2)in_channels=16,out_channels=32,kernel_size=5,stride=1,padding=2),# 输出图像大小 (32,14,14)nn.ReLU(),nn.MaxPool2d(2),# 输出图像大小(32,7,7))# 建立全卷积连接层self.out = nn.Linear(32 * 7 * 7, 10)  # 输出是10个类# 下面定义x的传播路线def forward(self, x):x = self.conv1(x)  # x先通过conv1x = self.conv2(x)  # 再通过conv2# 把每一个批次的每一个输入都拉成一个维度,即(batch_size,32*7*7)# 因为pytorch里特征的形式是[bs,channel,h,w],所以x.size(0)就是batchsizex = x.view(x.size(0), -1)  # view就是把x弄成batchsize行个tensoroutput = self.out(x)return outputdef dataloader():# 下载mnist手写数据集train_data = torchvision.datasets.MNIST(root='./data/',  # 保存或提取的位置  会放在当前文件夹中train=True,  # true说明是用于训练的数据,false说明是用于测试的数据transform=torchvision.transforms.ToTensor(),  # 转换PIL.Image or numpy.ndarraydownload=DOWNLOAD_MNIST,  # 已经下载了就不需要下载了)test_data = torchvision.datasets.MNIST(root='./data/',train=False  # 表明是测试集)return train_data,test_datadef get_text_data(test_data):# 进行测试# 为节约时间,测试时只测试前2000个test_x = torch.unsqueeze(test_data.train_data, dim=1).type(torch.FloatTensor)[:2000] / 255# torch.unsqueeze(a) 是用来对数据维度进行扩充,这样shape就从(2000,28,28)->(2000,1,28,28)# 图像的pixel本来是0到255之间,除以255对图像进行归一化使取值范围在(0,1)test_y = test_data.test_labels[:2000]return test_x,test_ydef get_cnn_net():# 加载网络到 gpucnn = CNN()print(cnn)return cnndef train(train_data,test_data):# 批训练 50个samples, 1  channel,28x28 (50,1,28,28)# Torch中的DataLoader是用来包装数据的工具,它能帮我们有效迭代数据,这样就可以进行批训练train_loader = Data.DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True  # 是否打乱数据,一般都打乱)# 获取测试数据集test_x,test_y = get_text_data(test_data)# 获取 cnn 网络cnn = get_cnn_net()# 优化器选择Adamoptimizer = torch.optim.Adam(cnn.parameters(), lr=LR)# 定义损失函数loss_func = nn.CrossEntropyLoss()  # 目标标签是one-hotted# 把x和y 都放入Variable中,然后放入cnn中计算output,最后再计算误差# 开始训练for epoch in range(EPOCH):for step, (b_x, b_y) in enumerate(train_loader):  # 分配batch dataoutput = cnn(b_x)  # 先将数据放到cnn中计算output### 梯度下降算法 ###loss = loss_func(output, b_y)  # 损失函数,输出和真实标签的loss,二者位置不可颠倒optimizer.zero_grad()  # 清除之前学到的梯度的参数loss.backward()  # 反向传播,计算梯度optimizer.step()  # 应用梯度(权重更新)### 梯度下降算法 #### 每 50 step 输出一次预测结果if step % 50 == 0:test_output = cnn(test_x)pred_y = torch.max(test_output, 1)[1].data.numpy()accuracy = float((pred_y == test_y.data.numpy()).astype(int).sum()) / float(test_y.size(0))print('Epoch: ', epoch, 'setp: ',step,'| train loss: %.4f' % loss.data.numpy(), '| test accuracy: %.2f' % accuracy)#保存模型torch.save(cnn.state_dict(), 'test.pkl')
def predict(test_data):# 获取测试数据集test_x,test_y = get_text_data(test_data)# 获取cnn网络cnn = get_cnn_net()# 加载模型cnn.load_state_dict(torch.load('test.pkl'))# 设置为推理模式cnn.eval()# 测试的个数testNum = 10# 输入的测试集inputs = test_x[:testNum]# 输出的结果test_output = cnn(inputs)pred_y = torch.max(test_output, 1)[1].data.numpy()print(pred_y, 'prediction number')  # 打印识别后的数字print(test_y[:testNum].numpy(), 'real number')# 输出图片img = torchvision.utils.make_grid(inputs)img = img.numpy().transpose(1, 2, 0)# 下面三行为改变图片的亮度# std = [0.5, 0.5, 0.5]# mean = [0.5, 0.5, 0.5]# img = img * std + meancv2.imshow('win', img)  # opencv显示需要识别的数据图片key_pressed = cv2.waitKey(0)if __name__ == "__main__":# 数据加载train_data,test_data = dataloader()# 训练(先训练再预测)train(train_data,test_data)# 预测(预测前将训练注释掉,否则会再训练一遍)#predict(test_data)

gpu版本,即将数据和模型都转移到gpu(显存)上,可以加快训练的速度。要注意最后计算成功率的时候还需要将数据从gpu(显存)取出,因为无法直接在gpu(显存)中计算。

# 训练+测试import torch
import torch.nn as nn
import torch.utils.data as Data
import torchvision
import matplotlib.pyplot as plt
import os
import cv2torch.manual_seed(1)  # 使用随机化种子使神经网络的初始化每次都相同# 超参数
EPOCH = 10  # 训练整批数据的次数
BATCH_SIZE = 50
LR = 0.001  # 学习率
DOWNLOAD_MNIST = True  # 表示还没有下载数据集,如果数据集下载好了就写False# 用class类来建立CNN模型
# CNN流程:卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)->
#        卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)->
#        展平多维的卷积成的特征图->接入全连接层(Linear)->输出
class CNN(nn.Module):  # 我们建立的CNN继承nn.Module这个模块def __init__(self):super(CNN, self).__init__()# 建立第一个卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)self.conv1 = nn.Sequential(# 第一个卷积con2dnn.Conv2d(  # 输入图像大小(1,28,28)in_channels=1,  # 输入图片的高度,因为minist数据集是灰度图像只有一个通道out_channels=16,  # n_filters 卷积核的高度kernel_size=5,  # filter size 卷积核的大小 也就是长x宽=5x5stride=1,  # 步长padding=2,  # 想要con2d输出的图片长宽不变,就进行补零操作 padding = (kernel_size-1)/2),  # 输出图像大小(16,28,28)# 激活函数nn.ReLU(),# 池化,下采样nn.MaxPool2d(kernel_size=2),  # 在2x2空间下采样# 输出图像大小(16,14,14))# 建立第二个卷积(Conv2d)-> 激励函数(ReLU)->池化(MaxPooling)self.conv2 = nn.Sequential(# 输入图像大小(16,14,14)nn.Conv2d(  # 也可以直接简化写成nn.Conv2d(16,32,5,1,2)in_channels=16,out_channels=32,kernel_size=5,stride=1,padding=2),# 输出图像大小 (32,14,14)nn.ReLU(),nn.MaxPool2d(2),# 输出图像大小(32,7,7))# 建立全卷积连接层self.out = nn.Linear(32 * 7 * 7, 10)  # 输出是10个类# 下面定义x的传播路线def forward(self, x):x = self.conv1(x)  # x先通过conv1x = self.conv2(x)  # 再通过conv2# 把每一个批次的每一个输入都拉成一个维度,即(batch_size,32*7*7)# 因为pytorch里特征的形式是[bs,channel,h,w],所以x.size(0)就是batchsizex = x.view(x.size(0), -1)  # view就是把x弄成batchsize行个tensoroutput = self.out(x)return outputdef dataloader():# 下载mnist手写数据集train_data = torchvision.datasets.MNIST(root='./data/',  # 保存或提取的位置  会放在当前文件夹中train=True,  # true说明是用于训练的数据,false说明是用于测试的数据transform=torchvision.transforms.ToTensor(),  # 转换PIL.Image or numpy.ndarraydownload=DOWNLOAD_MNIST,  # 已经下载了就不需要下载了)test_data = torchvision.datasets.MNIST(root='./data/',train=False  # 表明是测试集)return train_data,test_datadef get_text_data(test_data):# 进行测试# 为节约时间,测试时只测试前2000个test_x = torch.unsqueeze(test_data.train_data, dim=1).type(torch.FloatTensor)[:2000] / 255# torch.unsqueeze(a) 是用来对数据维度进行扩充,这样shape就从(2000,28,28)->(2000,1,28,28)# 图像的pixel本来是0到255之间,除以255对图像进行归一化使取值范围在(0,1)test_y = test_data.test_labels[:2000]return test_x,test_ydef get_cnn_net():# 加载网络到 gpucnn = CNN()print(cnn)return cnndef train(train_data,test_data):# 批训练 50个samples, 1  channel,28x28 (50,1,28,28)# Torch中的DataLoader是用来包装数据的工具,它能帮我们有效迭代数据,这样就可以进行批训练train_loader = Data.DataLoader(dataset=train_data,batch_size=BATCH_SIZE,shuffle=True  # 是否打乱数据,一般都打乱)device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 获取测试数据集test_x,test_y = get_text_data(test_data)test_x = test_x.to(device)# 获取 cnn 网络cnn = get_cnn_net()#将网络加载到gpuprint(device)cnn = cnn.to(device)# 优化器选择Adamoptimizer = torch.optim.Adam(cnn.parameters(), lr=LR)# 定义损失函数loss_func = nn.CrossEntropyLoss()  # 目标标签是one-hotted# 把x和y 都放入Variable中,然后放入cnn中计算output,最后再计算误差# 开始训练for epoch in range(EPOCH):for step, (b_x, b_y) in enumerate(train_loader):  # 分配batch data# 加载数据到gpub_x = b_x.to(device)b_y = b_y.to(device)output = cnn(b_x)  # 先将数据放到cnn中计算output### 梯度下降算法 ###loss = loss_func(output, b_y)  # 损失函数,输出和真实标签的loss,二者位置不可颠倒optimizer.zero_grad()  # 清除之前学到的梯度的参数loss.backward()  # 反向传播,计算梯度optimizer.step()  # 应用梯度(权重更新)### 梯度下降算法 #### 每 50step 输出一次预测结果if step % 50 == 0:test_output = cnn(test_x)test_output = test_output.to('cpu')loss = loss.to('cpu')pred_y = torch.max(test_output, 1)[1].data.numpy()accuracy = float((pred_y == test_y.data.numpy()).astype(int).sum()) / float(test_y.size(0))print('Epoch: ', epoch, 'setp: ',step,'| train loss: %.4f' % loss.data.numpy(), '| test accuracy: %.2f' % accuracy)#保存模型torch.save(cnn.state_dict(), 'test.pkl')
def predict(test_data):# 获取测试数据集test_x,test_y = get_text_data(test_data)# 获取cnn网络cnn = get_cnn_net()# 加载模型cnn.load_state_dict(torch.load('test.pkl'))device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#将模型加载到gpu上cnn.to(device)# 设置为推理模式cnn.eval()# 测试的个数testNum = 10# 输入的测试集inputs = test_x[:testNum]#将数据加载到gpu上inputs = inputs.to(device)# 输出的结果test_output = cnn(inputs)# 将数据加载回内存inputs = inputs.to('cpu')test_output = test_output.to('cpu')pred_y = torch.max(test_output, 1)[1].data.numpy()print(pred_y, 'prediction number')  # 打印识别后的数字print(test_y[:testNum].numpy(), 'real number')# 输出图片img = torchvision.utils.make_grid(inputs)img = img.numpy().transpose(1, 2, 0)# 下面三行为改变图片的亮度# std = [0.5, 0.5, 0.5]# mean = [0.5, 0.5, 0.5]# img = img * std + meancv2.imshow('win', img)  # opencv显示需要识别的数据图片key_pressed = cv2.waitKey(0)if __name__ == "__main__":# 数据加载train_data,test_data = dataloader()# 训练(先训练再预测)train(train_data,test_data)# 预测(预测前将训练注释掉,否则会再训练一遍)#predict(test_data)

(1)pytorch 实现 minist手写数据集(cpu/gpu)版本相关推荐

  1. 基于CNN的MINIST手写数字识别项目代码以及原理详解

    文章目录 项目简介 项目下载地址 项目开发软件环境 项目开发硬件环境 前言 一.数据加载的作用 二.Pytorch进行数据加载所需工具 2.1 Dataset 2.2 Dataloader 2.3 T ...

  2. Pytorch实现mnist手写数字识别

    2020/6/29 Hey,突然想起来之前做的一个入门实验,用pytorch实现mnist手写数字识别.可以在这个基础上增加网络层数,或是尝试用不同的数据集,去实现不一样的功能. Mnist数据集如图 ...

  3. tensorflow入门之MINIST手写数字识别

    最近在学tensorflow,看了很多资料以及相关视频,有没有大佬推荐一下比较好的教程之类的,谢谢.最后还是到了官方网站去,还好有官方文档中文版,今天就结合官方文档以及之前看的教程写一篇关于MINIS ...

  4. 4-CNN-demo-03_CNN网络解决手写数据集

    文章目录 1.代码 2.结果 3.可视化 1.代码 import tensorflow as tf import os from tensorflow.examples.tutorials.mnist ...

  5. 6-Gans-01_手写数据集vanilla_gans

    """ GANs 使用MNIST数据集创建生成对抗网络(generative adversarial network). """ impor ...

  6. tensorflow2 minist手写数字识别数据训练

    ✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Tensorflow 文章目录 前言 一.tenosrflow minist手写数字识别代码 二.输出 三.参考资料 总结 前言 刚开始学习tensorf ...

  7. 用PyTorch实现MNIST手写数字识别(非常详细)

    ​​​​​Keras版本: Keras入门级MNIST手写数字识别超级详细教程 2022/4/17 更新修复下代码.完善优化下文章结构,文末提供一个完整版代码. 可以在这里下载源码文件(免积分): 用 ...

  8. 2.2 Mnist手写数据集

    2.2 Mnist手写数据集 全连接网络:网络层的每一个结点都与上一层的所有结点相连. 多隐层全连接神经网络: 代码如下: 1. 导入必要的模块 import numpy as np import p ...

  9. 【机器学习】PCA主成分项目实战:MNIST手写数据集分类

    PCA主成分项目实战:MNIST手写数据集分类 PCA处理手写数字集 1 模块加载与数据导入 2 模型创建与应用 手动反爬虫:原博地址 https://blog.csdn.net/lys_828/ar ...

  10. pytorch rnn 实现手写字体识别

    pytorch rnn 实现手写字体识别 构建 RNN 代码 加载数据 使用RNN 训练 和测试数据 构建 RNN 代码 import torch import torch.nn as nn from ...

最新文章

  1. Apache+tomcat+mysql安装步骤
  2. boost::test模块带有自定义初始化测试的静态库使用变体
  3. python实现数字形式转换
  4. MySQL - 视图
  5. 【repost】Javascript操作DOM常用API总结
  6. 几个与IP地址类型有关的术语
  7. win11安装linux双系统
  8. 自己做的小游戏希望大家能喜欢
  9. 基于EEGLAB的脑电数据预处理
  10. QUIC特性之连接迁移和队头阻塞消除
  11. 冯诺依曼体系结构浅析
  12. nn棋盘放n个皇后java_帮忙解决一道大学c++题八皇后问题。在一个8*8的国际象棋盘,有八个皇后,每个皇后占一格:要求棋盘上放上八个皇后是不出现...
  13. 保险核保、理赔|门诊住院发票识别||医疗单据医疗票据识别技术
  14. 台式计算机无法访问网络,台式机关机导致局域网内LAN设备无法连接网络
  15. 正睿OI DAY8 ks1
  16. ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)
  17. Gradle+组件化开发
  18. 牛客每日练习----wyh的数列,组合数问题,zzy的小号
  19. 服务端渲染ssr(server side render)
  20. 上海地铁站图路线图_资产商店路线图

热门文章

  1. js页面跳转与url获取
  2. 微信小程序调查报告(一)
  3. PHP+mysql共享自行车租赁管理系统
  4. 小米台灯突然自己亮了_米家台灯Pro,工作读书随我选
  5. java和vue的狱警管理系统监狱系统狱务管理系统
  6. 光环PMP下午茶做题时间
  7. 个推科普漫画,解读《女心理师》中的智能语音识别系统
  8. 在ubantu16.04系统下安装ros操作系统
  9. Cron表达式 生成器
  10. FLAG_ACTIVITY_CLEAR_TOP和singleTask的区别