深度学习与TensorFlow:理解卷积神经网络

在之前我们学习好搭建全连接神经网络后,今天让我们继续学习去搭建卷积神经网络,并且来使用mnist进行手写数字识别.

在我们使用的mnist数据集中,一张分辨率仅仅是 28x28 的黑白图像,就有近 40 万个待优化的参数。现实生活中高分辨率的彩色图像,像素点更多,且为红绿蓝三通道信息。 待优化的参数过多,容易导致模型过拟合。为避免这种现象,实际应用中一 般不会将原始图片直接喂入全连接网络。

因此将图片进行多次特征提取,再把提取后的计算机可读特征喂给全连接 网络,这样看起来是一个很好的主意.

1:关于卷积

卷积是一种有效提取图片特征的方法。一般用一个正方形卷积核,遍历图片 上的每一个像素点。图片与卷积核重合区域内相对应的每一个像素值乘卷积核内相对应点的权重,然后求和,再加上偏置后,最后得到输出图片中的一个像素值。

具体的计算过程如图中所示:

上面是 5x5x1 的灰度图片,1表示单通道,5x5表示分辨率,共有 5 行 5 列个灰度值。若用一个 3x3x1 的卷积核对此 5x5x1 的灰度图片进行卷积,偏置项 b=1,则求卷积的计算是:(-1)x1+0x0+1x2+(-1)x5+0x4+1x2+(-1)x3+0x4+1x5+1=1(注意不要忘记加偏置 1)

输出图片边长=(输入图片边长–卷积核长+1)/步长,此图为:(5 – 3 + 1)/ 1 = 3,输出图片是 3x3 的分辨率,用了 1 个卷积核,输出深度是 1,最后输出的是 3x3x1 的图片。

2:全零填充 Padding

有时会在输入图片周围进行全零填充,这样可以保证输出图片的尺寸和输入 图片一致

如图中所示:

例:在前面 5x5x1 的图片周围进行全零填充,可使输出图片仍保持 5x5x1 的 维度。这个全零填充的过程叫做 padding。

输出数据体的尺寸=(W−F+2P)/S+1

例:输入是 7×7,滤波器是 3×3,步长为 1,填充为 0,那么就能得到一个 5×5 的输出。如果步长为 2,输出就是 3×3。

如果输入量是 32x32x3,核是 5x5x3,不用全零填充,输出是(32-5+1)/1=28, 如果要让输出量保持在 32x32x3,可以对该层加一个大小为 2 的零填充。可以根 据需求计算出需要填充几层零32=(32-5+2P)/1 +1,计算出 P=2,即需填充 2 层零。

3:池化

在通过卷积获得了特征 (features) 之后,下一步我们希望利用这些特征去做分类。理论上讲,人们可以用所有提取得到的特征去训练分类器,例如 softmax 分类器,但这样做面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) * (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例 (example) 都会得到一个 892 * 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。

为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。

4:舍弃Dropout

在神经网络训练过程中,为了减少过多参数常使用 dropout 的方法,将一部 分神经元按照一定概率从神经网络中舍弃。这种舍弃是临时性的,仅在训练时舍 弃一些神经元;在使用神经网络时,会把所有的神经元恢复到神经网络中。比如 上面这张图,在训练时一些神经元不参加神经网络计算了。Dropout 可以有效减少过拟合。

dropout 一般会放到全连接网络中。在实际应用中,常常在前向传播构建神经网络时使用 dropout 来减小过拟合 加快模型的训练速度。

5:卷积NN

卷积NN的作用是借助卷积核(kernel)提取特征后,送入全连接网络.

卷积神经网络可以认为由两部分组成,一部分是对输入图片进行特征提取, 另一部分就是全连接网络,只不过喂入全连接网络的不再是原始图片,而是经过 若干次卷积、激活和池化后的特征信息。 卷积神经网络从诞生到现在,已经出现了许多经典网络结构,比如 Lenet-5、 Alenet、VGGNet、GoogleNet 和 ResNet 等。每一种网络结构都是以卷积、激活、 池化、全连接这四种操作为基础进行扩展。 Lenet-5 是最早出现的卷积神经网络,由 Lecun 团队首先提出,Lenet-5 有效 解决了手写数字的识别问题

Lenet 神经网络结构为:

①输入为 32*32*1 的图片大小,为单通道的输入;

②进行卷积,卷积核大小为 5*5*1,个数为 6,步长为 1,非全零填充模式;

③将卷积结果通过非线性激活函数;

④进行池化,池化大小为 2*2,步长为 1,全零填充模式;

⑤进行卷积,卷积核大小为 5*5*6,个数为 16,步长为 1,非全零填充模式;

⑥将卷积结果通过非线性激活函数;

⑦进行池化,池化大小为 2*2,步长为 1,全零填充模式;

⑧全连接层进行 10 分类。

Lenet 神经网络的结构图及特征提取过程如下所示:

Lenet 神经网络的输入是 32*32*1,经过 5*5*1 的卷积核,卷积核个数为 6 个, 采用非全零填充方式,步长为 1,根据非全零填充计算公式:输出尺寸=(输入 尺寸-卷积核尺寸+1)/步长=(32-5+1)/1=28.故经过卷积后输出为 28*28*6。 经过第一层池化层,池化大小为 2*2,全零填充,步长为 2,由全零填充计算公 式:输出尺寸=输入尺寸/步长=28/2=14,池化层不改变深度,深度仍为 6。用同 样计算方法,得到第二层池化后的输出为 5*5*16。将第二池化层后的输出拉直 送入全连接层。

根据 Lenet 神经网络的结构可得,Lenet 神经网络具有如下特点:

①卷积(Conv)、池化(ave-pooling)、非线性激活函数(sigmoid)相互交替;

②层与层之间稀疏连接,减少计算复杂度。

而我们下一篇文章,将会通过微调lenet网络,来让其适应mnist数据集,因此让我们来搭建我们自己的神经网络.

引用资料:

1;http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial

2:北大课程<人工智能与TensorFlow>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2507
来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1190
来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

642
来自专栏desperate633

LeetCode Invert Binary Tree题目分析

Invert a binary tree. 4 / \ 2 7 / \ / \1 3 6 9 to4 / \ 7 2 / \ / \9 6 3 1 Tri...

821
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3417
来自专栏聊聊技术

原 初学图论-Kahn拓扑排序算法(Kah

2878
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

2507
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1434
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

4469
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

402

扫码关注云+社区