深度学习与TensorFlow实战(八)卷积神经网络基础

CNN简介:卷积神经网络最初是为了解决图像识别等问题设计的,现在已经不仅仅是图像和视频,也可以用于时间序列信号,比如音频信号、文本数据等。在早期的图像研究中,最大的挑战如何组织特征,因为图像数据不像其他类型的数据那样可以通过人工理解来提取特征。在深度学习出现之前,我们必须借助SIFT,HOG等算法提取具有良好区分性的特征(SIFT等可以参考我的博文OpenCV图像处理),再集合SVM等机器学习算法进行图像识别。SIFT对一定程度的缩放、平移、旋转、视角改变、亮度调整等畸变,都具有不变性,是当时最重要的图像特征提取方法之一。可以说,在之前只能依靠SIFT等特征提取算法才能勉强进行可靠的图像识别。
然而,SIFT这类算法体征提取还是有局限性的,一般错误率在26%以上。CNN提取的特征可以达到更好的效果,同时它不需要将特征提取和分类训练两个过程分开,它在训练时就自动提取了最有效的特征。CNN可以直接使用图像的原始像素作为输入,而不必使用SIFT等算法提取特征,减轻了使用传统算法如SVM时必须要做的大量重复工作。和SIFT的等算法相似,CNN训练的模型同样对缩放、平移、旋转等畸变具有不变性,有很强的泛化性。CNN的最大特点在于卷积的权值共享结构,可以大幅度减少神经网络的参数量,防止过拟合的同时又降低了神经网络的复杂度。

一般的卷积神经网络有多个卷积层构成,每个卷积层中通常会进行如下几个操作。
(1)图像通过多个不同的卷积核的滤波,并加偏置,提取局部特征特征,每一个卷积核会映射出一个新的2D图像。
(2)将前面卷积的滤波器输出结果,进行非线性的激活函数处理,目前最常用的是使用relu函数,而以前sigmoid函数用的比较多。
(3)对激活函数的结果再进行池化操作(即降采样,比如2x2的图片降为1X1的图片),目前一般是使用最大池化,保留最显著特征,提升模型的畸变容忍能力。

全连接NN:每个神经元与前后相邻层的每一个神经元都有连接关系,输入是特征,输出为预测结果。
参数个数:(前层X后层+后层)
这里写图片描述
一张分辨率仅仅是28X28的黑白图像,就有近40万个待优化参数。现实中高分辨率的色彩图像,像素点更多,且为RGB三通道。
待优化参数过多,容易导致模型过拟合。为避免这种现象,实际应用中不会直接将原始图片输入到全连接网络。
在实际中,会先对原始图像进行特征提取,把提取到的特征喂给全连接网络,再让全连接网络计算该分类结果。
这里写图片描述

卷积:
卷积是一种有效提取图片特征的方法。一般用一个正方形卷积核,遍历图片上的每一个像素点。图片与卷积核重合区域相对应的每一个像素值乘以卷积核内相对应点的权重,然后求和,再加上偏置后,最后得到输出图片中的每一个像素值。
这里写图片描述
例如:上面是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,最后输出的是3x3x1的图片。

全0填充Padding
有时会在输入图片周围进行全0填充,这样可以保证输出图片的尺寸和输入图片一致。
这里写图片描述
例:在前面5x5x1 的图片周围进行全零填充,可使输出图片仍保持 5x5x1 的维度。这个全零填充的过程叫做 padding。

输出数据体的尺寸=(W-F+2P)/S+1
W:输入数据体尺寸,
F:卷积层神经元感知域,
S:步长,
P:0填充的数量

例:输入是 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 层零。
这里写图片描述

使用padding和不使用padding的输出维度
这里写图片描述
上一行公式是使用padding的输出图片边长,下一行公式是不使用padding的输出图片边长。公式如果不能整除,需要向上取整。如果用全0填充,也是padding=SAME。如果不用全0填充,也是就padding=VALID。
TensorFlow给出的卷积的函数
这里写图片描述

1)对输入图片的描述:用 batch 给出一次喂入多少张图片,每张图片的分辨率大小,比如 5 行 5 列,以及这些图片包含几个通道的信息,如果是灰度图则为单通道,参数写 1,如果是彩色图则为红绿蓝三通道,参数写 3。
2)对卷积核的描述:要给出卷积核行列分辨率列分辨率、通道数以及用了几个卷积核。比如上图描述,表示卷积核行列分辨率分别为3 行和 3 列,且是 1 通道的,一共有 16 个这样的卷积核,卷积核的通道数是由输入图片的通道数决定的,卷积核的通道数等于输入图片的通道数,所以卷积核的通道数也是1。一共有 16 个这样的卷积核,说明卷积操作后输出图片的深度是 16,也就是输出为 16 通道。
3)对卷积核滑动步长的描述:上图第二个参数表示横向滑动步长,第三个参数表示纵向滑动步长。第一个1和最后一个1这里是固定的。表示纵向和横向都以1为步长。
4)是否使用padding:用的是VALID。注意这里是以字符串的形式给出VALID。

多数情况下,输入的图片是RGB三个颜色组成的彩色图,输入的图片包含了红,绿,蓝三层数据,卷积核的深度应该等于输入图片的通道数,所以用3x3x3的卷积核,最后一个3表示匹配输入图像的3个通道,这样这个卷积核有三层,每层会随机生成9个待优化的参数,一共有27个待优化参数w和一个偏置b。
这里写图片描述
对于彩色图,按层分解开,可以直观表示上面这张图,三个颜色分量:红色分量,绿色分量和蓝色分量。
卷积计算方法和单层卷积核相似,卷积核为了匹配红绿蓝三个颜色,把三层的卷积核在三层的色彩图像上,重合的27个像素进行对应点的乘加运算,最后的结果再加上偏置b,求得输出图片的一个值。
这个5x5x3 的输入图片加了全零填充,使用 3x3x3 的卷积核,所有 27 个点与对应的待优化参数相乘,乘积求和再加上偏置 b 得到输出图片中的一个值6。
这里写图片描述
针对上面这幅彩色图片,用conv2d 函数实现可以表示为: 一次输入batch 张图片,输入图片的分辨率是 5x5,是 3 通道的,卷积核是 3x3x3,一共有 16 个卷积核,这样输出的深度就是 16,核滑动横向步长是 1,纵向步长也是 1,padding 选择 same,保证输出是5x5 分辨率。由于一共用了 16 个卷积核,所以输出图片是 5x5x16。

池化Pooling
TensorFlow给出了计算池化的函数。最大化池化用tf.nn.max_pool函数,平均池化用tf.nn.avg_pool函数。
函数中要给出四个信息,对输入的描述,对池化核的描述、对池化核滑动步长的描述和是否使用padding。
这里写图片描述

1)对输入的描述:给出一次batch张图片、行列分别率、输入通道的个数。
2)对池化核的描述:只描述行列分辨率,第一个和最后一个参数固定是1.
3)对池化核滑动步长的描述:只描述横向纵向滑动步长,第一个和最后一个参数固定是1.
4)是否使用padding:SAME用0填充,VALID不使用0填充。

舍弃Dropout
这里写图片描述

在神经网络训练过程中,为了减少过多参数常使用dropout的方法,将一部分神经元按照一定概率从神经网络中舍弃。这种舍弃是临时性的,仅在训练时舍弃一些神经元,在使用神经网络时,会把所有的神经元恢复到神经网络中。dropout有效减少过拟合。
TensorFlow提供的dropout的函数:用tf.nn.dropout函数。第一个参数连接上一层 的输出,第二个参数给出神经元舍弃的概率。
在实际应用,常常在前向传播构建神经网络时使用dropout来减少过拟合加快模型想训练速度。
dropout一般会放到全连接网络中。如果在训练参数的过程中,输出=tf.nn.dropout(上层输出,暂时舍弃神经元的概率),这样就有指定概率的神经元随机置0,置0的神经元不参加当前轮的参数优化。
卷积NN:借助卷积核kernel提取特征后,送入全连接网络。
卷积神经网络可以认为由两部分组成,一部分是对输入图片进行特征提取,另一部分就是全连接网络,只不过喂入全连接网络的图片不再是原始图片,而是经过若干次卷积、激活和池化的特征信息。
卷积网络从诞生到现在,已经出现了许多经典网络结构,比如Lenet-5,Alenet,VGGnet,Googlenet,ResNet等。每一种网络结构都是以卷积、激活、池化、全连接这四种操作作为基础。

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值