1. 知识点准备

在了解 CNN 网络神经之前有两个概念要理解,第一是二维图像上卷积的概念,第二是 pooling 的概念。

a. 卷积

关于卷积的概念和细节可以参考这里12,卷积运算有两个非常重要特性,以下面这个一维的卷积为例子:

第一个特性是稀疏连接。可以看到, layer m 上的每一个节点都只与 layer m-1 对应区域的三个节点相连接。这个局部范围也叫感受野。第二个特性是相同颜色的线条代表了相同的权重,即权重共享。这样做有什么好处呢?一方面权重共享可以极大减小参数的数目,学习起来更加有效,另一方面,相同的权重可以让过滤器不受图像位置的影响来检测图像的特性,从而使 CNN 具有更强的泛化能力。

b. 池化

理论上,我们将图像利用不同的过滤器通过卷积之后得到了多个卷积之后的图像,然后直接利用这些图像进行分类,但是这样计算量太大了。利用池化操作可以将数据量减小,同时在一定程度上保留原有的图像特征。关于 pooling, 概念更加简单了,详情可以参考这里7。池化又可以分为平均池化和最大池化,这里我们将采用最大池化。注意到,池化的区域是不重叠的,卷积的感受野是重叠的。

2. 卷积神经网络的搭建

下图是手写数字识别中采用的 lenet-5 简单的卷积神经网络模型:

  1. 原图是 28 × 28 的手写数字图片,通过第一次 20 个 5 × 5 的卷积核之后,得到 20 张卷积图片。卷积核的权重是取一定范围内的随机值,这样,一张 28 × 28 的图片就变为 20 张 (28-5+1)× (28-5+1)=24×24 的图片了。
  2. 将 24×24 的图片进行 2 × 2 的最大池化,得到 20 张 12 × 12 的图片。该图片的像素还需要进行 tanh 函数的变换才能作为下一个卷积层的输入。
  3. 将 tanh 变化之后的 12 × 12 大小的图片同样进行 20 × 50 个 5 × 5 的卷积操作之后得到 50 张 (12-5+1)× (12-5+1) = 8 × 8 的图片。
  4. 将 8×8 的图片进行 2×2 的最大池化,得到 50 张 4×4 的图片,再经过 tanh 函数进行归一化处理,就可以作为 MLP 的 800 个输入了。
  5. 余下来就是 MLP 的训练工作了。

3. LR, MLP,CNN 识别代码

已经训练好的模型系数的下载地址3。

三种方法识别手写数字的代码:

[python] view plaincopy
  1. import cPickle
  2. import numpy
  3. import theano
  4. import theano.tensor as T
  5. from theano.tensor.signal import downsample
  6. from theano.tensor.nnet import conv
  7. ########################################
  8. # define the classifer constructs
  9. ########################################
  10. class LogisticRegression(object):
  11. def __init__(self, input, W=None, b=None):
  12. if W is None:
  13. fle = open("../model_param/lr_sgd_best.pkl")
  14. W, b = cPickle.load(fle)
  15. fle.close()
  16. self.W = W
  17. self.b = b
  18. self.outputs = T.nnet.softmax(T.dot(input, self.W) + b)
  19. self.pred = T.argmax(self.outputs, axis=1)
  20. class MLP(object):
  21. def __init__(self, input, params=None):
  22. if params is None:
  23. fle = open("../model_param/mlp_best.pkl")
  24. params = cPickle.load(fle)
  25. fle.close()
  26. self.hidden_W, self.hidden_b, self.lr_W, self.lr_b = params
  27. self.hiddenlayer = T.tanh(T.dot(input, self.hidden_W) + self.hidden_b)
  28. self.outputs = T.nnet.softmax(T.dot(self.hiddenlayer, self.lr_W) \
  29. + self.lr_b)
  30. self.pred = T.argmax(self.outputs, axis=1)
  31. class CNN(object):
  32. def __init__(self, input, params=None):
  33. if params is None:
  34. fle = open("../model_param/cnn_best.pkl")
  35. params = cPickle.load(fle)
  36. fle.close()
  37. ################
  38. self.layer3_W, self.layer3_b, self.layer2_W, self.layer2_b, \
  39. self.layer1_W, self.layer1_b, self.layer0_W, self.layer0_b = params
  40. # compute layer0
  41. self.conv_out0 = conv.conv2d(input=input, filters=self.layer0_W)
  42. #                    filter_shape=(20, 1, 5, 5), image_shape=(1, 1, \
  43. #                        28, 28))
  44. self.pooled_out0 = downsample.max_pool_2d(input=self.conv_out0, \
  45. ds=(2, 2), ignore_border=True)
  46. self.layer0_output = T.tanh(self.pooled_out0 + \
  47. self.layer0_b.dimshuffle('x', 0, 'x', 'x'))
  48. # compute layer1
  49. self.conv_out1 = conv.conv2d(input=self.layer0_output, filters=self.layer1_W)
  50. #                    filter_shape=(50, 20, 5, 5), image_shape=(1, 20, \
  51. #                        12, 12))
  52. self.pooled_out1 = downsample.max_pool_2d(input=self.conv_out1, \
  53. ds=(2, 2), ignore_border=True)
  54. self.layer1_output = T.tanh(self.pooled_out1 + \
  55. self.layer1_b.dimshuffle('x', 0, 'x', 'x'))
  56. # compute layer2
  57. self.layer2_input = self.layer1_output.flatten(2)
  58. self.layer2_output = T.tanh(T.dot(self.layer2_input, self.layer2_W) + \
  59. self.layer2_b)
  60. # compute layer3
  61. self.outputs = T.nnet.softmax(T.dot(self.layer2_output, self.layer3_W)\
  62. + self.layer3_b)
  63. self.pred = T.argmax(self.outputs, axis=1)
  64. ########################################
  65. # build classifier
  66. ########################################
  67. def lr(input):
  68. input.shape = 1, -1
  69. x = T.fmatrix('x')
  70. classifer = LogisticRegression(input=x)
  71. get_p_y = theano.function(inputs=[x], outputs=classifer.outputs)
  72. pred_y = theano.function(inputs=[x], outputs=classifer.pred)
  73. return (get_p_y(input), pred_y(input))
  74. def mlp(input):
  75. input.shape = 1, -1
  76. x = T.fmatrix('x')
  77. classifer = MLP(input=x)
  78. get_p_y = theano.function(inputs=[x], outputs=classifer.outputs)
  79. pred_y = theano.function(inputs=[x], outputs=classifer.pred)
  80. return (get_p_y(input), pred_y(input))
  81. def cnn(input):
  82. input.shape = (1, 1, 28, 28)
  83. x = T.dtensor4('x')
  84. classifer = CNN(input=x)
  85. get_p_y = theano.function(inputs=[x], outputs=classifer.outputs)
  86. pred_y = theano.function(inputs=[x], outputs=classifer.pred)
  87. return (get_p_y(input), pred_y(input))

卷积神经网络(cnn) 手写数字识别相关推荐

  1. 卷积神经网络CNN 手写数字识别

    1. 知识点准备 在了解 CNN 网络神经之前有两个概念要理解,第一是二维图像上卷积的概念,第二是 pooling 的概念. a. 卷积 关于卷积的概念和细节可以参考这里,卷积运算有两个非常重要特性, ...

  2. 【图像识别】基于卷积神经网络CNN手写数字识别matlab代码

    1 简介 针对传统手写数字的随机性,无规律性等问题,为了提高手写数字识别的检测准确性,本文在研究手写数字区域特点的基础上,提出了一种新的手写数字识别检测方法.首先,对采集的手写数字图像进行预处理,由于 ...

  3. 读书笔记-深度学习入门之pytorch-第四章(含卷积神经网络实现手写数字识别)(详解)

    1.卷积神经网络在图片识别上的应用 (1)局部性:对一张照片而言,需要检测图片中的局部特征来决定图片的类别 (2)相同性:可以用同样的模式去检测不同照片的相同特征,只不过这些特征处于图片中不同的位置, ...

  4. 深度学习 卷积神经网络-Pytorch手写数字识别

    深度学习 卷积神经网络-Pytorch手写数字识别 一.前言 二.代码实现 2.1 引入依赖库 2.2 加载数据 2.3 数据分割 2.4 构造数据 2.5 迭代训练 三.测试数据 四.参考资料 一. ...

  5. 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)

    基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...

  6. keras从入门到放弃(十三)卷积神经网络处理手写数字识别

    今天来一个cnn例子 手写数字识别,因为是图像数据 import keras from keras import layers import numpy as np import matplotlib ...

  7. 卷积神经网络mnist手写数字识别代码_搭建经典LeNet5 CNN卷积神经网络对Mnist手写数字数据识别实例与注释讲解,准确率达到97%...

    LeNet-5卷积神经网络是最经典的卷积网络之一,这篇文章就在LeNet-5的基础上加入了一些tensorflow的有趣函数,对LeNet-5做了改动,也是对一些tf函数的实例化笔记吧. 环境 Pyc ...

  8. 【FPGA教程案例100】深度学习1——基于CNN卷积神经网络的手写数字识别纯Verilog实现,使用mnist手写数字数据库

    FPGA教程目录 MATLAB教程目录 ---------------------------------------- 目录 1.软件版本 2.CNN卷积神经网络的原理 2.1 mnist手写数字数 ...

  9. CNN卷积神经网络实现手写数字识别(基于tensorflow)

    1.1卷积神经网络简介 文章目录 1.1卷积神经网络简介 1.2 神经网络 1.2.1 神经元模型 1.2.2 神经网络模型 1.3 卷积神经网络 1.3.1卷积的概念 1.3.2 卷积的计算过程 1 ...

  10. 基于卷积神经网络的手写数字识别、python实现

    一.CNN网络结构与构建 参数: 输入数据的维数,通道,高,长 input_dim=(1, 28, 28) 卷积层的超参数,filter_num:滤波器数量,filter_size:滤波器大小,str ...

最新文章

  1. JAVAWEB技术之七过滤器
  2. python3urllib常见使用_Python3 urllib常用操作
  3. python 执行js打开链接_使用Python在链接的href中执行JavaScript
  4. com学习笔记(2)基本的com接口-QueryInterface的实现
  5. Windows备份服务器运行失败,用Windows Server Backup搞定服务器备份
  6. JavaScript 中常见设计模式整理
  7. caged系统pdf_热电材料的应用和研究进展.pdf
  8. Linux使用cups进行打印
  9. ueditor html模板,UEditor 编辑模板
  10. 如何删除ppt自带背景音乐_ppt模板里自带的背景乐怎么去掉?
  11. 第二章 Python数据类型和运算符
  12. filp_open/filp_close/vfs_read/vfs_write
  13. DL2 - Improving Deep Neural Networks- Hyperparameter tuning, Regularization and Optimization
  14. 《暖暖环游世界》:突破女性休闲游戏的商业化局限
  15. Android 11.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果
  16. jMonkeyEngine译文 FlagRush7(1)——拥抱大地让我们驾驶的不再是Box
  17. marked.js读取markdown文件,图片实现点击放大
  18. 《比海更深》 是枝裕和 读后感
  19. 分享——网页上的虚拟机
  20. 真实版的“北京爱情故事”

热门文章

  1. linux insight 使用教程,Insight API开源项目分析
  2. 1.3.8 excel for mysql_实时生成并下载大数据量的EXCEL文件,用PHP如何实现
  3. i是j的倍数c语言编程,【图片】【编程!】记录我C语言的一步步【极度恐慌漫画吧】_百度贴吧...
  4. P2801 教主的魔法(分块入门)
  5. 让开发变得更简单 | 阿里云中间件推出全新开发者服务
  6. Jvm(4),保持线程可见性的几种方法
  7. CRM User Status profile中Business Transaction字段的用途
  8. 瓷博会开幕,《锦绣中华》引围观
  9. 如何编写更好的SQL查询:终极指南-第二部分
  10. 工业机器人运动规划方法简述