转载自:https://blog.csdn.net/dong_lxkm/article/details/80575207

一、前言

最近一直在研究深度学习,联想起之前所学,感叹数学是一门朴素而神奇的科学。F=G*m1*m2/r²万有引力描述了宇宙星河运转的规律,E=mc²描述了恒星发光的奥秘,V=H*d哈勃定律描述了宇宙膨胀的奥秘,自然界的大部分现象和规律都可以用数学函数来描述,也就是可以求得一个函数。

神经网络(《简单又复杂的人工神经网络》)可以逼近任何连续的函数,那么神经网络就有无限的泛化能力。对于大部分分类问题而言,本质就是求得一个函数y=f(x),例如:对于图像识别而言就是求得一个以像素张量为自变量的函数y=F(像素张量),其中y=猫、狗、花、汽车等等;对于文本情感分析而言,就是为了求得一个以词向量或者段落向量为自变量的函数y=F(词向量),其中y=正面、负面等等……

二、导读

本篇博客包括以下内容:

1、卷积神经网络的原理

2、基于dl4j定型一个卷积神经网络来进行手写数字识别

三、卷积神经网络原理

下面左边有个9*9的网格,红色填充的部分构成了数字7,把红色部分填上1,空白部分填上0,就构成了一个二维矩阵,传统做法可以用求向量距离,如果数字全部都标准的写在网格中相同的位置,那么肯定是准确的,但是,实际上数字7在书写的过程中,可能偏左一点、偏右一点,变形扭曲一点,这时候就难以识别。另外,一幅图片的像素点的数量是巨大的,例如一幅50*50的图片将有2500个像素点,每个像素点有R、G、B三个维度的颜色,那么输入参数的个数有7500个,这个运算量是巨大的。

              

那么就需要有一个抽象特征、降低数据维度的方法,这就说到了卷积运算,用一个小于图片的卷积核扫过整幅图片求点积。卷积的过程看下图。图片来源于https://my.oschina.net/u/876354/blog/1620906

卷积运算的过程在于寻找图片中的显著特征,并达到降维的目的,整个过程相当于一个函数扫过另一个函数,扫过时两个函数的积分重叠部分并没改变图片的特征形状,并可以降低维度,另外还可以分区块来提取特征,并且拼接特征。

为了进一步降低维度,引入了池化,池化的方式有很多,如最大值,平均值。下图展示了一个步长为2的2*2最大池化过程,用一个2*2的方块扫描过,求Max,总共扫描4次,4次扫描的最大值分别是6、8、3、4。

最后,经过多层卷积和池化之后,会得到一个矩阵,该矩阵作为一个全连接网络的输入,在逼近一个函数,就识别出数字了,以上图得到的6、8、3、4为例,全连接网络求一个函数。

四、deeplearning4j手写体识别

1、先下载mnist数据集,地址如下:

http://github.com/myleott/mnist_png/raw/master/mnist_png.tar.gz

2、解压(我解压在E盘)

3、训练网络,评估(一些比较难的部分都做了注释)

  1. public class MnistClassifier {
  2. private static final Logger log = LoggerFactory.getLogger(MnistClassifier.class);
  3. private static final String basePath = "E:";
  4. public static void main(String[] args) throws Exception {
  5. int height = 28;
  6. int width = 28;
  7. int channels = 1; // 这里有没有复杂的识别,没有分成红绿蓝三个通道
  8. int outputNum = 10; // 有十个数字,所以输出为10
  9. int batchSize = 54;//每次迭代取54张小批量来训练,可以查阅神经网络的mini batch相关优化,也就是小批量求平均梯度
  10. int nEpochs = 1;//整个样本集只训练一次
  11. int iterations = 1;
  12. int seed = 1234;
  13. Random randNumGen = new Random(seed);
  14. File trainData = new File(basePath + "/mnist_png/training");
  15. FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
  16. ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator(); //以父级目录名作为分类的标签名
  17. ImageRecordReader trainRR = new ImageRecordReader(height, width, channels, labelMaker);//构造图片读取类
  18. trainRR.initialize(trainSplit);
  19. DataSetIterator trainIter = new RecordReaderDataSetIterator(trainRR, batchSize, 1, outputNum);
  20. // 把像素值区间 0-255 压缩到0-1 区间
  21. DataNormalization scaler = new ImagePreProcessingScaler(0, 1);
  22. scaler.fit(trainIter);
  23. trainIter.setPreProcessor(scaler);
  24. // 向量化测试集
  25. File testData = new File(basePath + "/mnist_png/testing");
  26. FileSplit testSplit = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
  27. ImageRecordReader testRR = new ImageRecordReader(height, width, channels, labelMaker);
  28. testRR.initialize(testSplit);
  29. DataSetIterator testIter = new RecordReaderDataSetIterator(testRR, batchSize, 1, outputNum);
  30. testIter.setPreProcessor(scaler); // same normalization for better results
  31. log.info("Network configuration and training...");
  32. Map<Integer, Double> lrSchedule = new HashMap<>();//设定动态改变学习速率的策略,key表示小批量迭代到几次
  33. lrSchedule.put(0, 0.06);
  34. lrSchedule.put(200, 0.05);
  35. lrSchedule.put(600, 0.028);
  36. lrSchedule.put(800, 0.0060);
  37. lrSchedule.put(1000, 0.001);
  38. MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
  39. .seed(seed)
  40. .iterations(iterations)
  41. .regularization(true).l2(0.0005)
  42. .learningRate(.01)
  43. .learningRateDecayPolicy(LearningRatePolicy.Schedule)
  44. .learningRateSchedule(lrSchedule)
  45. .weightInit(WeightInit.XAVIER)
  46. .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
  47. .updater(Updater.NESTEROVS)
  48. .list()
  49. .layer(0, new ConvolutionLayer.Builder(5, 5)
  50. .nIn(channels)
  51. .stride(1, 1)
  52. .nOut(20)
  53. .activation(Activation.IDENTITY)
  54. .build())
  55. .layer(1, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
  56. .kernelSize(2, 2)
  57. .stride(2, 2)
  58. .build())
  59. .layer(2, new ConvolutionLayer.Builder(5, 5)
  60. .stride(1, 1)
  61. .nOut(50)
  62. .activation(Activation.IDENTITY)
  63. .build())
  64. .layer(3, new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX)
  65. .kernelSize(2, 2)
  66. .stride(2, 2)
  67. .build())
  68. .layer(4, new DenseLayer.Builder().activation(Activation.RELU)
  69. .nOut(500).build())
  70. .layer(5, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
  71. .nOut(outputNum)
  72. .activation(Activation.SOFTMAX)
  73. .build())
  74. .setInputType(InputType.convolutionalFlat(28, 28, 1))
  75. .backprop(true).pretrain(false).build();
  76. MultiLayerNetwork net = new MultiLayerNetwork(conf);
  77. net.init();
  78. net.setListeners(new ScoreIterationListener(10));
  79. log.debug("Total num of params: {}", net.numParams());
  80. // 评估测试集
  81. for (int i = 0; i < nEpochs; i++) {
  82. net.fit(trainIter);
  83. Evaluation eval = net.evaluate(testIter);
  84. log.info(eval.stats());
  85. trainIter.reset();
  86. testIter.reset();
  87. }
  88. ModelSerializer.writeModel(net, new File(basePath + "/minist-model.zip"), true);//保存训练好的网络
  89. }
  90. }
  1. 运行main方法,得到如下评估结果:

# of classes:    10
 Accuracy:        0.9897
 Precision:       0.9897
 Recall:          0.9897
 F1 Score:        0.9896

整个效果还比较好,保存好训练的网络,便可以用于手写体数据的识别了,下一篇博客将介绍怎么加载定型的网络,配合springMVC来开发一个手写体识别的应用。

卷积神经网络通俗解读相关推荐

  1. 神经网络通俗理解和理解,卷积神经网络通俗理解

    通俗易懂:彻底明白什么是神经网络 想象一个黑箱子,你给它输入(样本),它给你输出(实际输出),但是输出和你想要的结果有偏差,于是你事先告诉它你想要的结果(期望输出),它做一些调整(调整内部权值和阈值) ...

  2. 深度学习三人行(第8期)----卷积神经网络通俗原理

    上一期,我们一起学习了深度学习中如何避免过拟合, 深度学习三人行(第7期)----深度学习之避免过拟合(正则化) 接下来我们一起学习下网红网络之卷积神经网络(CNN),我们多多交流,共同进步.本期主要 ...

  3. 卷积神经网络架构不包含,卷积神经网络架构分析

    卷积神经网络结构基本单元层有哪些? . 输入层:输出特征矩阵卷积层:进行卷积运算池化层:进行pooling缩小维度中间激活层:可有可无,一般为ReLU类的计算简单的激活函数对特征值修正这里卷积层.池化 ...

  4. 经典的卷积神经网络结构,卷积神经网络基本结构

    卷积神经网络通俗理解 . 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetwork ...

  5. 神经网络与卷积神经网络,什么是卷积神经网络

    前馈神经网络.BP神经网络.卷积神经网络的区别与联系 一.计算方法不同1.前馈神经网络:一种最简单的神经网络,各神经元分层排列.每个神经元只与前一层的神经元相连.接收前一层的输出,并输出给下一层.各层 ...

  6. 卷积神经网络 神经网络,卷积神经网络基础知识

    卷积神经网络通俗理解 . 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetwork ...

  7. 卷积神经网络各层的意义,卷积神经网络各层作用

    1.卷积神经网络结构基本单元层有哪些? 输入层:输出特征矩阵 卷积层:进行卷积运算 池化层:进行pooling缩小维度 中间激活层:可有可无,一般为ReLU类的计算简单的激活函数对特征值修正 这里卷积 ...

  8. 一维卷积神经网络结构图,一维卷积神经网络原理

    1.卷积神经网络算法是什么? 一维构筑.二维构筑.全卷积构筑. 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Fe ...

  9. 什么是卷积神经网络?它目前主要应用于哪些领域?

    卷积神经网络主要做什么用的? 卷积网络的特点主要是卷积核参数共享,池化操作. 参数共享的话的话是因为像图片等结构化的数据在不同的区域可能会存在相同的特征,那么就可以把卷积核作为detector,每一层 ...

最新文章

  1. Linux系统介绍 文件夹和文件管理命令 10个(pwd ls cd mkdir touch mv rm cp tar ln)
  2. 给定一个日期,算出上周五日期
  3. 前端学习(705):do-while
  4. [Leetcode]@python 107. Binary Tree Level Order Traversal II
  5. 如何避免用动态语言的思维写Go代码
  6. EFLAGS 寄存器,EFLAGS 交叉引用,EFLGAS条件码
  7. 类别不均衡的分类问题
  8. VMware之虚拟机迁移
  9. MCU新趋势—Cortex M0/M3/M4 行业应用主题研讨会
  10. 已知传递函数,求幅频响应?
  11. 【Iftop】实时监控流量工具
  12. NAT协议(网络地址转换协议)详解
  13. 教你如何将 Excel 中的数据按模板批量生成 Word、Excel、PPT、PDF 以及 Txt 类型的文本文件
  14. 第22次 CCF CSP认证一二题题解及感悟
  15. 如何免费下载知网论文
  16. MacBook连接打印机-惠普HP LaserJet Pro MFP M427fdn 连接方法
  17. 非平衡电桥电阻计算_非平衡电桥的原理和应用 - 范文中心
  18. 如何在 WordPress 中启用WebP 图片?webp有什么优势?
  19. JDK 商用正式免费、Log4j2 爆核弹级漏洞、LayUI 下线...2021 发生的 10 件大事。。。
  20. 居家旅行杀人越货必备 开发主板的另类功能

热门文章

  1. 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)
  2. 利用exchangelib快速上手使用python发邮件
  3. 命令行运行Python脚本时传入参数的三种方式
  4. TVM适配NN编译Compiler缺陷
  5. TVM部署预定义模型
  6. MindSpore基本原理
  7. 语义分割:基于openCV和深度学习(二)
  8. 2021年大数据Spark(二十一):Spark Core案例-SogouQ日志分析
  9. Django 验证码4.4
  10. 零起点学算法03——超简单模仿算术题