ねぇ        呐

私に気付いてよ   快点注意到我吧

もう そんな事   那种事 一定

望んでも      再去奢求

しょうがないだろ  也无可奈何吧

——真野あゆみ《Bipolar emotion》(作詞:Mitsu)

本文将以mnist为原材料,用ResNet模型,实现一个正确率超过99%的手写数字分类器。


材料准备

首先我们下载MNIST数据集——可以从我的这篇文章中找到资源:

刘冬煜:关于图像识别的相关图片资源​zhuanlan.zhihu.com

接着,我们搭建一个较深层的网络结构:

一个可行的网络结构示意图
    CNN.set_Input_Layer(1);                     /*  0 */        //28x28CNN.add_Convolution_Layer(16, 5, 5, Valid);                      //24x24CNN.add_BatchNorm_Layer(16);                 /*  2 */CNN.add_Activation_Layer(&relu_actfunc, 16);CNN.add_Pooling_Layer(16, 2, 2, Max_Pooling);                       //12x12CNN.add_Convolution_Layer(40, 5, 5, Valid);                      //8x8CNN.add_Activation_Layer(&relu_actfunc, 40);           /*  6 */    //------.CNN.add_Convolution_Layer(40, 3, 3, Same);                 //  |CNN.add_Activation_Layer(&relu_actfunc, 40);                   //  |CNN.add_Convolution_Layer(40, 3, 3, Same);                 //<-----'CNN.create_short_cut(6, 9);CNN.add_Activation_Layer(&relu_actfunc, 40);CNN.add_Convolution_Layer(64, 5, 5, Same);CNN.add_BatchNorm_Layer(64);                  /* 12 */CNN.add_Activation_Layer(&relu_actfunc, 64);CNN.add_Convolution_Layer(64, 5, 5, Valid);                     //4x4CNN.add_Activation_Layer(&relu_actfunc, 64);CNN.add_Spatial_Pyramid_Pooling_Layer(320, Average_Pooling, 2);                //1x1CNN.add_Fully_Connected_Layer(10);CNN.add_Softmax_Layer(10);                   /* 18 */

材料准备完成,下一步将是数据的处理。

预处理

首先,我们将60000张手写数字图片读入到显存之中,通过公式

的整数RGB转化为
的浮点数作为输入。

由于对于原图每个像素点,RGB值都相等(灰度图),我们索性将三个通道合并为了一个通道作为输入。

损失函数

这是一个单标签多分类问题,我们可以使用交叉熵公式。这里我保留了反向概率项:

其中

是期望输出向量,有且仅有一个1,其余9个元素都是0;而
是实际输出向量。

通过交叉熵损失函数,我们能提高正确标签对应神经元的输出,降低错误标签对应神经元的输出。

其他超参数

由于采用了Adam法更新参数,我使用初始学习率

,一阶动量
,二阶动量

ResNet往往不使用Dropout,这个工程也不例外,因而我采用了L2正则化。初始的惩罚为:权值惩罚因子

,偏置量惩罚因子
。而后期更是加大了这个惩罚因子。

Batch size我设置得小了一点(因为我的显存比较小),只有60。

训练过程

起初误差下降得非常好:

初始的误差曲线

但训练了一段时间后,明显感觉“后劲不足”:

误差较高,下降缓慢

于是我果断将学习率砍掉一半,并提高了两个动量项,使用学习率

,一阶动量
,二阶动量
,权值惩罚因子
,偏置量惩罚因子
,继续训练。

于是乎误差又稳定地下降了不少:

调整后的误差曲线

于是我每迭代500轮,都会将网络的学习率砍掉一半,并缓缓提升动量和惩罚因子。

大约训练到第3000轮的时候,我测试了一下网络,其中训练集结果和测试集结果如下:

训练集结果
测试集结果

接下来就要加入“提前终止”了——每训练200轮跑一次验证集,如果验证集的准确率有所下降,提前终止训练。

结果到第400轮的时候就结束了,结果如下:

训练集结果
测试集结果

最终我把错误预测的结果挑了出来:

被错误预测的结果

有些被错误预测的结果甚至可以迷惑一个正常人类了……

我们甚至还可以将特征可视化出来,看图片那些成分相应每一个标签:

每一张图片对于每个标签的相应

可以横向比较——对于每张手写数字图片,正确标签响应位置与其他标签是有明显不同的。

这个网络的二进制文件我也将会发到专栏的GitHub上。


开学了。

今天带着学妹逛校园,好开心。

同时这也让我感受到了一些哲理。

我懂得一个人来上海举目无亲的寂寞,但我却不希望学弟学妹继承这份失落。

同样经历过实验失败的痛苦,我也不希望有人重蹈覆辙。

专栏依旧不定期更新,敬请期待。

基于人工智能方法的手写数字图像识别_【工程分析】基于ResNet的手写数字识别...相关推荐

  1. 基于人工智能深度学习技术的高速公路路段安全指数分析与预测

    基于人工智能深度学习技术的高速公路路段安全指数分析与预测 保障交通运输安全平稳运行! 保障交通运输安全平稳运行! 保障交通运输安全平稳运行! 对滴,重要事情一定要说三遍 加强道路安全与畅通 是促进交通 ...

  2. python鱼眼图像识别_一种基于鱼眼摄像头的人脸识别锁以及识别方法与流程

    本发明涉及人脸识别领域,特别涉及一种基于鱼眼摄像头的人脸识别锁. 背景技术: 人脸识别具有用在门锁上存在一些不足.例如,门锁一般装在门上,其高度在安装时已经固定,针对不同身高的用户来说可能造成人脸图像 ...

  3. 调用枚举接口重写方法提示找不到符号_看看人家那后端API接口写得,那叫一个巴适~...

    前言 在目前应用发达的场景下,我们往往需要接入客户端(win).APP程序.网站程序.以及目前热火朝天的微信应用等,这些数据应该可以由同一个服务或者同事由多个提供, Web API作为整个纽带的核心, ...

  4. 基于zynq的千兆网udp项目_一种基于ZYNQ的四路万兆以太网安全交换机的制作方法...

    本实用新型涉及网络安全.网络通信技术领域,尤其是一种基于ZYNQ的四路万兆以太网安全交换机,适用于大中型企业的交换网络. 背景技术: 随着互联网的高速发展,传统的以太网交换机在功能和性能上已不能满足要 ...

  5. 基于词典方法和机器学习方法的中文情感倾向分析(毕业设计:附完整代码)

    项目概述: 使用机器学习 和 情感词典 这两种方法 分别对中文新闻类文本进行情感极性分析 输入一段新闻文本能够得到文本的情感极性 1.3 目标人群 需要对已有中文文本数据进行情感分析的企业及用户 AP ...

  6. java正则表达式匹配数字范围_在java中怎么利用正则表达式匹配数字

    在java中怎么利用正则表达式匹配数字 发布时间:2020-12-03 17:47:12 来源:亿速云 阅读:58 作者:Leah 在java中怎么利用正则表达式匹配数字?针对这个问题,这篇文章详细介 ...

  7. 如何把自己的经历写成小说_教你如何把一本小说写成太监

    文/不追猫 2016年过完春节我决定开始写小说,当时我辞职了,前一份的工作是工程管理,其实是什么都做,需要去工地,去找甲方监理办事,做工程资料.决算送审等等,属于跑腿打杂的那种. 那不是我喜欢的工作, ...

  8. python 写入excel数字格式_从Pandas写入Excel时设置默认数字格式

    我把浮点数的格式改为小数点后1位.data = {'A Prime': {0: 3.26, 1: 3.24, 2: 3.22, 3: 3.2, 4: 3.18, 5: 3.16, 6: 3.14, 7 ...

  9. 夸奖对方代码写的好_夸奖别人画得好怎么写

    展开全部 可以使用一些成语: 栩栩如生:形容画作.雕塑中的艺术形象等生动逼真,就像活的一32313133353236313431303231363533e58685e5aeb9313333656634 ...

最新文章

  1. 2 Hadoop的安装与配置
  2. jvm 堆 比例_JVM调优原则
  3. 搭建opencv环境
  4. IDEA(2021)最全常用快捷键《必须收藏》
  5. Linq的Distinct太不给力了
  6. AD09由英文改中文菜单步骤
  7. 那是什么进程 —— svchost.exe是什么? 它为何运行?
  8. 时间序列-异常检测(Anomaly Detection)(四):深度学习方法
  9. Java Web之Cookie、Session
  10. Matlab中绘制颜色渐变曲线
  11. itext将html转换为pdf,使用itext将html转换为pdf
  12. 程序员最大的悲哀是什么?
  13. Pytorch、TorchVision、Python、Jetpack版本匹配问题
  14. jupyter notebooks打开的是百度网盘
  15. 华北电大学计算机考研资料汇总
  16. 【数据编制架构】什么是数据编织(Data fabric)? 完整指南
  17. 面试经验之华为暑期实习
  18. 现在计算机有64位吗,任何电脑都可以装64位系统吗|是不是所有的电脑都可以装64位系统...
  19. android直播app下载地址,g直播app官方下载安装
  20. [译] 设计师的决策树:当遇到猪队友时,你需要一个系统来控制每个人

热门文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(46)-工作流设计-设计分支
  2. 10月第1周中国.COM域名增1万个 涨幅环比缩小82%
  3. javascript 复习内容
  4. Linux--线程编程
  5. ARP病毒查找与防范
  6. C#数据导出Excel详细介绍
  7. 火箭队老板成比特币粉丝 旗下豪车经销商接受BTC、BCH支付
  8. 为什么 Django 能持续统治 Python 开发世界
  9. 生产场景 bond 0实战
  10. HPUX在oracle10g安装和卸载缩写