什么是神经网络中的填充?
正如我们所知,在构建神经网络时,我们正在使用卷积核来提取与当前数据集相关的特征,这是让网络在卷积时学习的重要部分。
例如,如果你想训练你的神经网络来分类它是狗还是猫,那么在应用卷积时,内核将从图像中提取特征,比如狗的耳朵和狗的尾巴,以便区分在狗和猫特征之间,这就是卷积的工作方式。
从上图中可以看出,如果在 6 x 6 输入图像大小上卷积 3 X 3 内核,则图像大小将减少 2,因为内核大小为 3,输出为 4 x 4,进一步应用 3 x 3如上图所示,4 x 4 尺寸将缩小为 2 x 2。但是,如果您现在应用 3 x3,我们将无法进一步卷积,因为输出图像大小现在是 2 x 2,因为从数学上讲,您将得到一个不可能的负维度。
但是如果你观察到它可能会发生我们的网络不会考虑一些重要的特征,因为我们最终只有 2 个卷积,因此很难找到提取所有特征来区分你正在训练神经网络的两个对象。
为什么图像大小只减少了 2?
我们有计算输出图像大小的公式:
其中 O 代表输出图像大小,n 是输入图像大小,k 是内核大小。
如果您查看上面的示例,我们的输入图像大小为 6 x 6,内核大小为 3 x 3。因此,应用第一个卷积后的输出大小将为
O = 6 - 3 + 1
O = 4 x 4
这是Padding出现的原因之一
为什么我们需要填充?
- 网络的主要目的是在卷积层的帮助下找到图像中的重要特征,但可能会发生某些特征是内核(特征提取器)访问的次数非常少的图像的角落,因此可能会错过一些重要信息。
- 因此,填充是我们在图像的 4 个角周围添加额外像素的解决方案,这会将图像大小增加 2,但应尽可能保持中性,这意味着不要以任何方式改变原始图像特征,使其变得复杂网络进一步了解。此外,我们可以添加更多层,因为现在我们有一个更大的图像。
为了便于理解,我们可以说填充有助于内核(特征提取器)更多次访问图像角落周围的像素,以提取重要特征以便更好地学习。
如果您看到下图显示了内核如何访问图像的像素的说明,那么内核应该至少访问每个像素超过 1 次或 2 次以提取重要特征,这一点很重要。
看一下上面的图像,同时将图像与内核作为围绕图像角落的像素进行卷积,与像素的中间部分相比,内核访问的图像角落的时间非常少。
如果您可以从上图中观察到,我们在图像的 4 个角周围添加了零填充,并且在应用第一个卷积后,输入图像大小从 6 x 6 增加到 8 x 8,输出图像大小为 6 x 6,即根据上面的问题,我们想要什么。
应用填充后,我们可以观察到与没有填充相比,有可能再卷积一次,这有助于网络同时提取更多特征以更好地学习。即使应用填充也可以帮助我们再进行一次卷积,这有助于网络同时提取更多特征以更好地学习。
如果您看到下图,这是填充图像的样子:
有两种类型的填充
- 有效填充,我们根本不应用填充 & P=0
- 由于我们应用了相同的填充,输出图像大小应等于输入图像大小的相同填充。
从上面的公式我们有:
现在,我们在图像的下、上、右、左四面添加填充,添加零填充。 (注意:这里我们不考虑跨步)
让我们看一个带填充的新公式
如果您看到相同的填充 O = n(输出图像大小应等于输入图像大小)
所以, 从这里我们可以在上面提到的等式中简单地使用数学
为什么我们总是使用 3 x 3、5 x 5 等奇数内核,为什么不使用 4 x 4 内核(偶数内核)?
例如,如果您想使用4 x 4内核,那么您必须使用什么填充?
You can use the above formula p =( k – 1)/2
We have kernel = 4 x 4
p= 4 -1/2 = 3/2 = 1.5
这意味着您必须在图像的 4 个角周围添加 1.5 像素才能应用填充,这又是不可能的,因为我们不能添加 1.5 像素,而是只能添加整数,例如 1,2,3,4 ,5,6 和 7 等图像角落周围的像素。
这就是为什么内核总是奇数的原因之一,这样我们就可以在图像周围添加整数个像素以提取更多特征,因为在周围添加 1.5 个像素没有任何意义并且很难同时添加.
为什么我们总是使用 padding = 1以及说您使用 1的填充是什么意思。在所有标准网络中,您注意到使用的填充始终为 1,就像我们在填充时添加一些信息一样我们自己和干扰网络并不是一个好主意,因为网络学习到的最好的特征是自学一次,并且还会大量增加输入大小并使模型变得沉重。
为什么是“零填充”?
现在我们脑海中出现的一个问题是,为什么人们总是盲目地使用零(0)填充,只是按照我们在博客或任何课程中阅读的内容。所以,现在我们了解了填充是如何工作的,以及它对神经网络的重要性。但是一个问题总是出现在我们的脑海中,为什么只有0 填充?为什么我们不能使用 1-padding 或任何数字?
当我们对图像进行归一化时,像素范围从 0 到 1,如果尚未归一化,则像素范围将从0 到 255。
如果我们考虑这两种情况,我们可以看到 0 是最小的数字。因此,使用 0 成为一种更通用的方法。此外,它在计算上是有意义的,因为我们正在考虑这些像素中的最小数量。
但它并不总是 0,考虑一个值范围从 -0.3 到 0.3的情况,在这种情况下,最小数字是 -0.3,如果我们在它周围使用 0 的填充,它将是灰色而不是黑色.当我们有一个像 tanh 这样的激活函数时也会出现同样的情况,它的值范围从 -1 到 1,在这种情况下,最小值是 -1。所以我们将使用 (-1) 填充而不是 0 填充,用于在其周围添加黑色像素。如果我们使用 0 填充,那么它将是灰色边界而不是黑色。
但是这里有一个问题,我们并不总是可以计算失活值会发生什么,因此我们寻找一个可以满足大多数情况而没有问题的中性值,这就是 0 填充可以节省我们的地方。如果我们甚至考虑上述两个范围,我们可以看到,使用 0 填充会给出灰色边界而不是黑色,这并不是一个巨大的损失。我们也可以将这些情况称为“最小填充情况”,我们正在考虑激活映射中的最小值。
大多数时候,我们在层之间使用 relu,所以在 relu 的情况下, 0 成为最小值,这就是它如此流行和通用的原因。
我们需要在每一层添加填充吗?
让我们借助一个示例来理解这一点,让 MNIST 数字识别器数据集
以下是来自 MNIST 数据集的一些示例图像。上面我们讨论了使用填充的两个主要原因:
- 卷积后收缩输出,因此我们可以添加更多层来提取更多特征
- 添加以保存边缘周围的信息丢失
您可以看到数据集中的数字不在边缘,它们主要在中心。这意味着边缘周围的信息可能非常少。因此,在这种情况下,添加填充的主要原因是添加更多层。但 MNIST 也不需要那么多层。您可以在初始层中添加填充,但在所有层中它会很有用,您只会使模型更重。
总之,它取决于数据集和问题陈述,哪些层需要填充。