详解:卷积神经网络的组成部分
最近不少最先进的体系结构采用了许多附加组件来补充卷积操作。在这篇文章中,将解释一些能够提高现代卷积神经网络的速度和精度的最重要的组件。首先解释每个组件的理论,然后在keras中做具体的实现。
池化
使CNN非常有效的第一个秘诀就是池化。池化是一种矢量,用于对图像的每个局部区域进行标量变换,就像卷积一样,但是,与卷积不同,它们没有过滤器,也不用局部区域计算点积,而是计算平均值(平均池)中的像素,或者只是选择强度最高的像素并丢弃剩余的像素(最大池)。
以上是2 x 2池,它将有效地将特征映射的大小减少2倍。
池化这个想法可能会产生反作用,因为它会导致信息的丢失,但它已被证明在实践中非常有效,因为它使得代理对图像呈现的变化不变,并且还减少了背景噪声的影响。近年来效果最好的是Max Pooling,它基于这样的想法,即某个地区的最大像素代表该地区最重要的特征。通常我们希望分类的物体图像可以包含许多其他物体,例如,出现在汽车图像某处的猫可能会误导分类器。池化有助于缓解这种影响,并使卷积神经网络更好地泛化。
它也大大降低了卷积神经网络的计算成本。通常,网络中每层的图像大小与每层的计算成本(触发器)成正比。随着图层变得更深,池化会减少图像的尺寸,因此,它有助于防止网络需要的触发器数量激增。分段卷积有时可以用作池化的替代物。
Dropout
过度拟合是网络在训练集上运行良好的一种现象,但在测试集上表现不佳。这通常过分依赖于训练集中特定功能的存在。Dropout是一种打击过度拟合的技巧,它可以随机设置一些激活值为0,从而将它们杀死。通过这样做,网络不得不探索更多的分类图像而不是过度依赖一些特征。这是AlexNet中的关键元素之一。
批标准化
神经网络的一个主要问题是梯度消失。来自谷歌大脑的Ioffe和Szegedy发现,这主要是由于内部协变量的变化,这种情况是由于信息通过网络传播而引起的变化数据分布。他们所做的是设备称为批标准化的技术。这通过将每批图像标准化来实现零均值和单位方差。
它通常放置在cnns的非线性(relu)之前。它极大地提高了准确性,同时极大地加快了训练过程。
数据增强
所需要的最后一种成分或现代的卷积神经网路是数据增强。人类视觉系统在适应图像平移、旋转和其他形式的扭曲方面非常出色。拍摄一张图像,无论是翻转它还是旋转它,大多数人仍然可以识别它。然而,卷积神经网络却不善于处理这种扭曲,他们可能会失败,仅仅是一个小小的翻译的错误。他们解决这个问题的关键则是随机扭曲训练图像,使用水平翻、垂直翻转、旋转、白化、移位和其他扭曲。这将使卷积神经网络学会如何处理这种扭曲,因此,他们将能够在现实世界中更好地工作。
另一种常用技术是从每幅图像中减去平均图像,并除以标准偏差。
对于这些组件是什么以及它们为什么运行良好的解释我们可能已经看过很多,甚至感到厌倦,以下将为大家解释如何在keras中实现它们。
在这篇文章中,所有的实验都将在CIFAR10上进行,这是一个包含60,000个32×32RGB图像的数据集。它分为50,000个训练图像和10,000个测试图像。
为了让事情更加模块化,我们为每个图层创建一个简单的函数。
这里是我们代码中最重要的方面,Unit函数定义了一个简单的图层,其中包含三个图层,第一个是先前解释的BatchNormalization(批标准化),接下来我们添加RELU激活,最后添加卷积,注意如何在conv之前放置RELU ,这是一种最近的做法,称为“前激活”。
现在我们将许多单元层合并成一个单一的模型。
在这里,我们使用功能性API来定义我们的模型,我们从三个单元格开始,每个单元格有64个过滤器,后面是一个最大池化层,将我们的32 x 32图像减少到16 x 16。接下来是3,128个过滤器单元, 在这一点上,我们的图像变成8 x 8,最后,我们有另外3个单元,256通道。 请注意,每次我们将图像尺寸缩小2倍时,我们会将通道数加倍。
我们添加0.5的比率,这将随机取消50%的参数,正如我之前解释的那样,它会打击过度拟合。
接下来,我们需要加载cifar10数据集并执行一些数据增强的操作。
在上面的代码中,加载训练和测试数据后,我们从每幅图像中减去平均图像并除以标准偏差,这是一种基本的数据增加技术,有时,我们可能只减去平均值并跳过标准偏差部分 ,来看哪一个最适合使用。
对于更先进的数据增强,我们的图像加载过程会略有改变,keras有一个非常有用的数据增强实用程序,可以简化整个过程。
下面的代码可以做到这一点。
在上面,我们首先是指定10度的旋转角度,5/32的高度和宽度的偏移以及最终的水平翻转,所有这些变换都将随机应用于训练集中的图像。 请注意,还有更多转换存在,你可以查看可以为该类指定的所有参数。 请记住,过度使用数据增强可能是有害的。
接下来,我们必须将标签转换为独热编码。
以下是完整的代码。
这里有一些不同之处,需要注意。
正如先前所解释的,cifar 10由32 x 32的RGB图像组成,因此输入形状有3个通道,这是不言而喻的。
下一行创建我们定义的模型的实例,并传入输入形状
最后,最后一行将打印出我们网络的完整摘要,包括参数的数量。
需要解释的最后一部分是:
首先我们定义要运行的时代的数量,并且每个时期的步数不要与数字混淆。
这里的50000是训练图像的总数,我们使用的是128的批处理大小,这意味着,对于20个周期中的每一个,网络将不得不超过50000/128批次的图像。
接下来是拟合函数。
由于我们使用数据生成器类来实现数据增长,我们必须使用fit_generator函数,也不要直接传入train_x和train_y,而是通过数据生成器中的流函数传递它们,同时我们也指定批量大小,接下来我们说明在这种情况下是验证数据,在另一种情况下是测试数据。 所有其他事情保持不变。
这种设置在20个周期后产生82%。
你可以尝试调整参数和网络,看看可以提高多少准确度。