什么是卷积、最大池化和 dropout?

优采云 发布时间: 2021-07-29 00:11

  什么是卷积、最大池化和 dropout?

  个人主页:

  

  什么是卷积、最大池化和 dropout?

  这个文章是深度学习系列中的文章。请检查#series 1 和#series 2

  

  数据增强

  欢迎来到本系列教程的第三部分!本周我将讲解一些卷积神经网络(Convolutional Neural Network,CNN)并讨论如何解决欠拟合和过拟合。

  一、卡罗(卷积)

  那么卷积到底是什么?您可能还记得在我之前的博客中,我们使用了一个小过滤器(Filter)并在整个图像上刷了这个过滤器。然后,图像的像素值乘以滤波器中的像素值。使用深度学习的美妙之处在于我们不必考虑这些过滤器应该是什么样子(神经网络会自动学习并选择最佳过滤器)。通过 Stohastic Gradient Descent (SGD),网络可以独立学习以达到最优过滤效果。过滤器随机初始化,位置不变。这意味着他们可以找到图像中的任何对象。同时,模型还可以学习物体在图像中的位置。

  零填充是应用此过滤器时的有用工具。这些都是图像周围的零像素额外边界——这使我们能够在我们在图像上滑动过滤器时捕捉图像的边缘。您可能想知道过滤器应该有多大。研究表明,较小的过滤器通常性能更好。在本例中,我们使用 3x3 过滤器。

  当我们依次将这些过滤器滑过图像时,我们基本上创建了另一个图像。因此,如果我们的原创图像是 30x 30,带有 12 个过滤器的卷积层的输出将是 30x30x12。现在我们有了一个张量,它基本上是一个多于 2 维的矩阵。现在您也知道 TensorFlow 名称的由来了。

  在每个卷积层(或多个)之后,我们通常会得到最大池化层。该层将减少图像中的像素数。例如,我们可以从图像中取出一个正方形,并用正方形中像素的最大值替换该正方形。

  

  最大池化

  由于最大池化,我们的过滤器可以探索图像的更大部分。此外,由于像素损失,我们通常在使用最大池化后增加过滤器的数量。

  理论上,每个模型架构都是可行的,并为您的问题提供了很好的解决方案。但是,某些架构比其他架构快得多。糟糕的架构可能需要比您剩余的生命周期更长的时间才能得出结果。因此,考虑模型的架构以及我们为什么使用最大池并更改使用的过滤器数量是有意义的。为了在 CNN 上完成这部分内容,此页面提供了一个很好的视频来可视化 CNN 内部发生的事情。

  二、欠拟合与过拟合

  您如何知道您的模型是否欠拟合?如果验证集的准确率高于训练集的准确率,则模型欠拟合。此外,如果整个模型表现不佳,也称为欠拟合。例如,使用线性模型进行图像识别通常会导致欠拟合。也有可能是Dropout(Dropout)导致你在深度神经网络中出现欠拟合。

  Dropout 在模型训练时随机设置部分激活函数为零(使网络的某些隐藏层节点的权重不起作用)以避免过拟合。这种情况一般不会出现在验证/测试集的预测中。如果出现,可以去掉Dropout来解决。如果模型现在*敏*感*词*过度拟合,您可以开始添加小批量的 Dropout。

  一般规则:从过拟合模型开始,然后采取措施消除过拟合。

  当您的模型过拟合训练集时,就会发生过拟合。那么模型将难以泛化,并且无法识别不在训练集中的新示例。例如,您的模型只能识别训练集中的特定图像,不能识别通用模型,并且您在训练集上的准确率会高于在验证/测试集上的准确率。那么我们可以使用哪些方法来减少过拟合呢?

  减少过拟合的步骤

  添加更多数据,使用数据增强,使用泛化性能更好的模型结构,添加正则化(大多数情况下dropout,L1/L2正则化也是可以的)以降低模型复杂度。

  第一步当然是采集更多的数据。但是,在大多数情况下,您不能这样做。这里我们首先假设您采集 拥有所有数据。下一步是数据增强:这是我们一直推荐的方法。

  数据增强包括随机旋转图像、放大图像、添加滤色器等。

  数据增强仅适用于训练集,不适用于验证/测试集。检查是否使用了过多的数据增强是非常有效的。例如,如果您的猫的图片放大太多,则猫的特征将不再可见,并且模型不会通过对这些图像的训练获得更好的结果。让我们探索数据增强!

  对于Fast AI课程的学习者:请注意,“width_zoom_range”在教科书中用作数据扩展参数之一。但是,此选项在 Keras 中不再可用。

  

  原图

  现在我们来看看进行数据增强后的图像。仍然可以清楚地识别所有“猫”。

  

  数据增强后的图像

  第三步是使用泛化性能更好的模型结构。不过,更重要的是第四步:增加正则化。三个最受欢迎的选项是:Dropout、L1 正则化和 L2 正则化。正如我之前提到的,在深入研究中,大多数时候你会看到 Dropout。 Dropout 在训练期间删除随机激活样本(使它们为零)。在 Vgg 模型中,这只适用于模型末尾的全连接层。但是,它也可以应用于卷积层。需要注意的是,Dropout 会造成信息丢失。如果在第一层丢失了一些信息,那么整个网络都会丢失这些信息。因此,一个好的做法是对第一层使用较低的Dropout,然后逐渐增加。第五个也是最后一个选项是降低网络的复杂性。事实上,在大多数情况下,各种形式的归一化足以应对过拟合。

  

  左边是原创神经网络,右边是使用Dropout后的网络

  三、Batch Normalization(批量归一化)

  最后,让我们讨论批量归一化。这是您永远需要做的事情!批量归一化是一个比较新的概念,所以还没有在Vgg模型中实现。

  如果您对机器学习有所了解,那么您一定听说过标准化模型输入。批量标准化加强了这一步。批量归一化在每个卷积层之后添加一个“归一化层”。这使得模型在训练过程中收敛速度更快,因此允许您使用更高的学习率。

  简单地标准化每个激活层的权重是行不通的。随机梯度下降非常顽固。如果您将其中一个设置得非常高,则下次训练时它只会重复该过程。通过批量归一化,模型可以调整所有权重,而不是每次训练只调整一个权重。

  四、MNIST 号码识别

  MNIST 手写数字数据集是机器学习中最著名的数据集之一。数据集也是测试我们学到的CNN知识的好方法。 Kaggle 还托管 MNIST 数据集。我快速写的这段代码在这个数据集上的准确率为 96.8%。

  import pandas as pd

from sklearn.ensemble import RandomForestClassifier

train = pd.read_csv('train_digits.csv')

test = pd.read_csv('test_digits.csv')

X = train.drop('label', axis=1)

y = train['label']

rfc = RandomForestClassifier(n_estimators=300)

pred = rfc.fit(X, y).predict(test)

  然而,配备深度CNN可以达到99.7%的效果。本周我将尝试将 CNN 应用于此数据集。我希望我能报告最新的准确性并讨论我下周遇到的问题。

  如果你喜欢这个文章,欢迎推荐给别人看。您还可以关注此*敏*感*词*,了解我在快速 AI 课程中的进度。到时候见!

  译者注:在翻译本文时,我提前查阅了一些资料,以确保更好地理解原文。不过由于我个人水平有限等原因,有些地方不是很清楚,同时补充了一些点。辅助参考资料,更好地说明问题。如果读者在翻译中发现问题,请随时与我联系或提出问题。

  个人主页:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线