(Tensorflow)手把手CNN入门:手写数字识别-阿里云开发者社区

开发者社区> 人工智能> 正文

(Tensorflow)手把手CNN入门:手写数字识别

简介: 手把手带你实战——《CNN入门:手写数字识别》!

深度学最令人兴奋域之一就是算机视觉。通,我够创建自动驾驶车系统、面部检测和自医学像分析等等。在本文中,我将向你展示卷的基本原理以及如何自己建一个手写数字行分类的系统

f6b247650f1d689504cfca4e25034dcb51025592

卷积神经网络的功能似乎是人类大脑中生物功能的复制,早在1959年,David Hubel和Torsten Wiesel对猫和猴进行了研究,这些研究揭示了动物视觉皮层的功能。他们发现的是,许多神经元具有小的局部接受性,即仅对整个视野的一小块有限区域起反应。他们发现某些神经元会对某些特定模式做出反应,例如水平线、垂直线和其他圆形。他们还发现其他神经元具有更大的感受野并且被更复杂的模式刺激,这些模式是由较低水平神经元收集的信息组合。这些发现奠定了我们现在称之为卷积神经网络的基础。接下来,我们逐一介绍卷积神经网络的组成。

1、卷积层

2d70cefa740f2cc038d80e75e40638048c38faa1

卷积神经网络中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。你可以将每个过滤器描成一个窗口,窗口在像的尺寸上滑检测属性。滤镜在图像上滑动的像素数量称为步幅。步幅1意味着波器一次移一个像素,其中2的步幅将向前跳2个像素。

73ecc6045e01bf1bde3b89fcb406fa0c7eddbf9b

在上面的例子中,我可以看到一个垂直线检测器。原始6x6,它使用3x3滤镜进行扫描,步长为1,从而4x4尺寸出。而过滤器仅对其视野左右列中的部分感兴趣。通过对图像的入求和并乘以3×3滤波器的配置,我们得到3+1+2-1-7-5=-7。然后波器向右移一步,然后1+0+3-2-3-1=-2-2然后-7的位置。此程将持4x4网格完成止。之后,下一个特征图将使用它自己的唯一过滤/内核矩阵计算自己的

15a86d263f6985ecdf967711136fb29f69acdad6

2.池化层

池化层的目标是通过聚合卷积层收集的值或所谓的子采样来进一步降低维度。除了为模型提供一些正则化的方案以避免过度拟合之外,这还将减少计算量。它们遵循与卷积层相同的滑动窗口思想,但不是计算所有值,而是选择其输入的最大值或平均值。这分别称为最大池化和平均池化。

82e0724bc954f5a7cee1d109e2be159046af863b

这两个组件是卷积层的关键构建块。然后,你通常会重复此方法,进一步减少特征图的尺寸,但会增加其深度。每个特征图将专门识别它自己独特的形状。在卷积结束时,会放置一个完全连接的图层,其具有激活功能,例如Relu或Selu,用于将尺寸重新整形为适合的尺寸送入分类器。例如,如果你的最终转换层为3x3x128矩阵,但你只预测10个不同的类,则需要将其重新整形为1x1152向量,并在输入分类器之前逐渐减小其大小。完全连接的层也将学习它们自己的特征,如在典型的深度神经网络中。

 

254b10c36cc57ad5b4c29050ee3cdf3b2e416b2d

现在让我们看看在MNIST手写数字数据集上的Tensorflow中的实现。首先,我将加。使用sklearn中的fetch_mldata,我mnist数据集并将像和标签分配xy变量。然后我建我的训练/测试装置。最后,我几个例子来了解任

ef619adc341c0add6a08c3c701f1294bc66749c4

9654fc0957ef7fe02fe508c7aea5b49c1bd8c425

接下来,我行一些数据增强是提高模型性能的可靠方法。通过创训练图像的化,可以模型建正化。我将使用Scipyndimage像向右、向左、向上和向下移1个像素。这不仅提供了更多种类的例子,而且还会大大增加我们训练集的大小

031ae02232bfb7477e5e8c708cd41e916d19d00d

163b69e9b3264e01d03a3529d9c8c6a6ec52773d

7e53e942d10112cb4fb5bc9108dca54c13b35095

我将向你展示的最后一种数据增强的方式:使用cv2库创建图像的水平翻转。我们还需要为这些翻转图像创建新标签,这与复制原始标签一样简单。

 

5ac5604e161e92264ff87e51bad974dc02a6156f

设置“flipCode = 0”生垂直翻

62aaa93a76ee617f39b9822988fcc243f409db2d

接下来,我建一个助函数,用于将随机微型批次提供的神络输入。由于卷积层的性,它在前向和后向播步需要大量的存器。考具有4x4滤镜的图层,输出128步幅1的特征和具有尺寸299x299RGB图像输入的SAME填充。参数的数量将相等(4x4x3+1x128 = 6272.现在考虑这128个特征中的每一个都299x299个神元,并且些神元中的每一个都4x4x3输入的加权和这意味着我们需要4x4x3x299x299x150=643,687,200算,这只是一个训练的例子。

a44ad825c35415a44f6d498cc47491c7813f1057

现在我开始建我的网架构。首先,我们为的培数据/特征创建占位符。我需要将它重新整形-1,28,28,1)矩,因tensorflow conv2d层需要4维输入。我将第一个null,以允将任意批量大小提供占位符。

ed63c7a5c193e9b2be7eab64d4fddeb23a84640a

接着我们设计我们的卷积层,我是从Le-NET5(由Yann LeCun)网架构中取灵感,架构因其在手写数字分方面成功而名。我建你研究Le-NET5以及其他经过验证的模型,这样就可以了解哪种卷积网络适用于不同的任务链接:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf

bbda097cda7321d8522a178d1f7a8ac9b2939c15

我们模型卷积层的第一12个特征图组成,使用3x3过滤器,步幅为1们选择SAME填充,通入周添加一个零填充来保持像的尺寸。然后,我们设置最大池化使用3x3过滤器,步幅为1,这将13x13x12。所以我从一个28x28x1像开始,然后我个矩阵传递给第二个转换层,第二个转换层具有3x3过滤器的深度,stride=1SAME填充这将输出一个6*6*16维矩阵。你可以看到我正在小特征图的度空,但要更深入。接下来,我使用Selu函数激活两个密集来减少每层输入的数量大一半,直到最将它们输入我logits

f7378d0f42e181f43249631f113b82a21c9937f5

接着我们创建我们的损失函数,在这种情况下,它将是softmax交叉熵,它将输出多类概率。你可以将交叉熵视为各种数据点之间距离的度量。我们选择AdamOptimizer(自适应矩估计),当梯度下降时自动调整它的学习率。最后,我们创建了一种评估结果的方法。Tensorflow的in_top_k函数将计算我们的logits并选择最高分。然后我们使用我们的准确度变量输出0-1%之间的百分比。

现在我们已经为训练阶段做好了准备,让我们看看我们的模型表现得如何。

1114c4a7ac5bcd0f6fb14d8a78b0157c6a814f92

在第19epoch,我们的正确率在0.9907这已经比任何机器学习算法的结果更好,因此卷积已经取得了领先现在让我们尝试使用我们的移位功能/功能,并的网添加两个新元素:dropout和批量标准化

00f5bdadd438496d3bb04507b1dcbdee2f9fe739

使用placeholder_with_default节点修改现有占位符,这些节点将保存批量标准化和dropout层生成的。在训练,我值设True,在测试,我将通过设False将其关

c54ff134067c4dbdbdaf05f432fbc886a337d991

批量准化只是简单每批次的数据准化。我指定了0.9量。而dropout和正化指定动量为1才能在训练完全随机地关闭节点。这导致其余节点必须松弛,从而提高其有效性。想象一下,一家公司决定每周随机选择50工留在家里。其余的工作人将不得不有效地外的工作,提高他在其他域的技能。

0bdf49e11aa18b985de540c3497e897545f9140b

接着我们创建我失函数,训练步骤估步,然后行一些修改。通批量准化行的算在每次迭代期保存更新操作。为了访问这些,我们分配一个变量extra_update_ops = tf.get_collectiontf.GraphKeys.UPDATE_OPS)。在我训练操作期,我将其作列表training_op一起提供sess.run。最后,在验证/测试预测时,我们通过feed_dict为占位符分配False。我不希望在预测阶段有任何随机化。为了获得输出,我们使用我们的测试集运行logits操作。让我们看看这个模型添加正则化/标准化并且正在使用增强数据的方法表现得如何。

94e4eca0101d07bec398bbc155490106529e39a9

29epoch,我们在10,000个数字的测试集上达到了99.5%的准确率。正如你所看到的那,第二个epoch时模型精确度达到了99%,而之前的模型只有16%虽然0.05%可能不是很多,但在理大量数据时这是一个重大改。最后,我将向你展示如何在logits输出上使用np.argmax产生的预测

8f1bb22294bcb2069765c98ebb526870047501f4

本文由阿里云云栖社区组织翻译。

文章原标题《convolutional-neural-net-in-tensorflow》

作者:Stephen Barter 译者:虎说八道,审校:。

文章为简译,更为详细的内容,请查看原文

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
人工智能
使用钉钉扫一扫加入圈子
+ 订阅

了解行业+人工智能最先进的技术和实践,参与行业+人工智能实践项目

其他文章