卷积神经网络实现数字识别

1.导入相关的库

2.载入数据

(数据集组成)

(tensor()格式的为标准化的单张img)

(标准化后)

3.CNN骨架

4.训练

(第九轮训练)

5.测试

6.保存模型

(训练损失曲线)

(测试损失曲线)

(测试正确率曲线)

完整代码

import time
import torch
from matplotlib import pyplot as plt
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, ReLU, Dropout
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from torchvision.datasets import mnist#采用GPU
device = torch.device("cuda:0")#加载数据
train_batch_size = 128
test_batch_size = 128
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.5],[0.5])])
data_train = mnist.MNIST('./data',train=True,transform=transform,target_transform=None,download=True)
data_test = mnist.MNIST('./data',train=False,transform=transform,target_transform=None,download=True)train_data_size = len(data_train)
test_data_size = len(data_test)
print("训练数据集的长度为:{}".format(train_data_size))
print("测试数据集的长度为:{}".format(test_data_size))train_loader = DataLoader(data_train,batch_size=train_batch_size,shuffle=True)
test_loader = DataLoader(data_test,batch_size=test_batch_size,shuffle=True)# 可视化数据
examples = enumerate(test_loader)
batch_idx, (example_data, example_targets) = next(examples)
plt.figure(figsize=(9, 9))
for i in range(9):plt.subplot(3, 3, i+1)plt.title("Ground Truth:{}".format(example_targets[i]))plt.imshow(example_data[i][0], cmap='gray', interpolation='none')plt.xticks([])plt.yticks([])
plt.show()#搭建CNN网络
class network(nn.Module):#[128,1,28,28]def __init__(self) -> None:super(network,self).__init__()self.module1 = nn.Sequential(Conv2d(1, 16, 3, 1, padding=1),#[128,16,28,28] w=h=28-3+1+2=28ReLU(inplace=True),MaxPool2d(kernel_size=2,stride=2),#[128,16,14,14] w=h=(28-2+1+2)/2=14Conv2d(16, 32, 3, 1, padding=1),#[128,32,14,14] w=h=14-3+1+2=14ReLU(inplace=True),MaxPool2d(kernel_size=2,stride=2),#[128,32,7,7] w=h=(14-2+1+2)/2=7Flatten(),Linear(32*7*7, 128),ReLU(),Dropout(p=0.5),#缓解过拟合,一定程度上正则化Linear(128, 10))def forward(self,x):x = self.module1(x)return xnet = network()
net = net.to(device)
print("模型结构为:")
print(net)#训练模型#损失函数#交叉熵
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)#优化器
#随机梯度下降SGD
learning_rate = 0.01
optimizer = torch.optim.SGD(net.parameters(),lr=learning_rate)#记录训练的次数
total_train_step = 0
#记录测试的次数
total_test_step = 0
#训练轮数
epoch = 10start_time = time.time()#添加tensorboard
writer = SummaryWriter("CNN_logs")
for i in range(epoch):print("第{}轮训练开始:".format(i+1))#训练步骤开始net.train()total_train_loss = 0for data in train_loader:imgs, targets = dataimgs = imgs.to(device)targets = targets.to(device)outputs = net(imgs)loss = loss_fn(outputs, targets)total_train_loss = total_train_loss + loss.item()#梯度清零,优化器优化模型optimizer.zero_grad()loss.backward()optimizer.step()total_train_step = total_train_step + 1if total_train_step % 100 == 0:end_time = time.time()print("time:",end_time-start_time)writer.add_scalar("train_time",end_time-start_time,total_train_step)print("训练次数:{},Loss: {}".format(total_train_step, loss.item()))writer.add_scalar("train_loss",loss.item(),total_train_step)#测试步骤开始net.eval()total_test_loss = 0total_accuracy = 0with torch.no_grad():for data in test_loader:imgs, targets = dataimgs = imgs.to(device)targets = targets.to(device)outputs = net(imgs)loss = loss_fn(outputs, targets)total_test_loss = total_test_loss + loss.item()#argmax(1)行,(0)列#正确率accuracy = (outputs.argmax(1)==targets).sum()total_accuracy = total_accuracy + accuracyprint("第{}轮,整体测试集上的Loss:{}".format(i+1, total_test_loss))print("整体测试集上的正确率:{}".format(total_accuracy / test_data_size))writer.add_scalar("(每一轮)all_test_loss",total_test_loss, total_test_step)writer.add_scalar("test_accuracy",total_accuracy / test_data_size, total_test_step)total_test_step = total_test_step+1#保存每一轮训练的结果torch.save(net, "network_{}.pth".format(i+1))#torch.save(net.state_dict(),"net_{}.pth".format(i+1))print("模型已保存.")
writer.close()

卷积神经网络实现数字识别相关推荐

  1. Android基于卷积神经网络的数字手势识别识别数字手势0-10 Android studio编译

    这篇博客主要基于我做的一个数字手势识别APP,具体分享下如何一步步训练一个卷积神经网络模型(CNN)模型,然后把模型集成到Android Studio中,开发一个数字手势识别APP.Android基于 ...

  2. 卷积神经网络和图像分类识别

    Andrew Kirillov 著 Conmajia 译 2019 年 1 月 15 日 原文发表于 CodeProject(2018 年 10 月 28 日). 中文版有小幅修改,已获作者本人授权. ...

  3. PyTorch实现基于卷积神经网络的面部表情识别

    基于卷积神经网络的面部表情识别(Pytorch实现)----台大李宏毅机器学习作业3(HW3) 一.项目说明 给定数据集train.csv,要求使用卷积神经网络CNN,根据每个样本的面部图片判断出其表 ...

  4. 【转】干货|孙启超:卷积神经网络在人脸识别技术中的应用

    2018-08-27 21:45:01 随着 iPhone X 的发布,Face ID 人脸识别技术开始进入人们的日常生活中,当我们拿起手机并看着它的时候就可以实现手机解锁的功能.而人脸识别中的关键技 ...

  5. 基于卷积神经网络的验证码识别(准确率87.5%+)

    目录 一.任务背景与目标概述 二.卷积神经网络简介 三.方案设计及实现过程 四.实验结果及分析与讨论 五.结论 实现代码 一.任务背景与目标概述 随着现代网络技术的飞速发展和提高,改善了我们的生活质量 ...

  6. 基于卷积神经网络的数字手势识别APP(安卓) 毕业设计 附完整代码

    项目简介 这是一个基于卷积神经网络的数字手势识别 APP(安卓),主要功能为:通过手机摄像头识别做出的数字手势,能够识别数字 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 对应的手 ...

  7. 如何利用离散Hopfield神经网络进行数字识别(2)

    如何利用离散Hopfield神经网络进行数字识别

  8. 如何利用离散Hopfield神经网络进行数字识别(1)

    如何利用离散Hopfield神经网络进行数字识别,代码部分.

  9. 基于深度卷积神经网络进行人脸识别的原理是什么?

    原文:https://www.zhihu.com/question/60759296 基于深度卷积神经网络进行人脸识别的原理是什么? 这里的人脸识别包括但不限于:人脸检测,人脸对齐,身份验证识别,和表 ...

最新文章

  1. 分布式事务中间件 Fescar—RM 模块源码解读
  2. 卧槽!又一个Python神器!
  3. Calc3: Multiple Integrals
  4. python【蓝桥杯vip练习题库】ADV-350珠心算测验
  5. History of Microsoft Windows CE
  6. C++中的wchar_t(转)
  7. C/C++多个链接库含有同名函数,编译会报错吗
  8. 7-6 列出连通集 (25 分)(详解)
  9. Linux配置yum源(离线和在线)
  10. 设计模式行为模式_使用行为模式建立很棒的社区
  11. mini2440驱动分析之触摸屏
  12. storm集群部署和配置过程详解
  13. Apache中配置ASP.NET环境
  14. 毕业设计 - 基于JAVA人脸识别管理系统(人脸搜索与人脸库管理)
  15. iPhone 5福音 网友发布Nano-SIM剪卡教程
  16. iReport表达式
  17. 100 位测试工程师的 2018 年度关键词与 2019 展望
  18. 蒙氏素材---创意时钟---三段卡 蒙氏教育
  19. JS_微信公众号开发调用扫码支付功能
  20. 爬取虎扑社区-晒晒照片

热门文章

  1. 单片机彩灯移动实验_单片机动态控制64个彩灯实验报告
  2. 滑铁卢计算机专业世界最新排名,滑铁卢大学计算机专业世界排名介绍
  3. Linux Shell Shock漏洞利用和实战
  4. 小小蜜蜂蜇壮汉不死,注射打针反致死
  5. openwrt 端口映射
  6. 浙江大学计算机学院 00级,“00”后来了!浙江大学2018级新生报到啦!
  7. 用Python绘制专业的K线图【含源代码】
  8. ArrayList 源码分析
  9. 精确匹配(FIND_IN_SET)
  10. 无源NFC方案 无源NFC对外供电 NFC感应电源 无源NFC通讯 NFC无线充电方案 NFC无线取电方案 显示NFC标签