Padding
Last updated
Was this helpful?
Last updated
Was this helpful?
为了构建深层神经网络 一个你非常需要使用的 对基本的卷积操作的改进是填充(padding) 我们来看看它是如何工作的 在前面我们讲过 如果你用一个3x3的过滤器(filter)卷积一个6x6的图片 你最终会得到的输出是一个4x4的矩阵 这是因为3x3过滤器的可能放的位置的数目是4x4 事实上 为了适应你的6x6矩阵大小 3x3过滤器只有4x4可能的位置 这其中的通用公式是 如果你有一个 n x n 的图片并且想使用一个 f x f 的过滤器 这样输出的维度将会是 (n-f+1) x (n-f+1) 在这个例子中 6-3+1 = 4 这就是为什么你最后得到一个4x4的输出 这其实有两个缺陷:第一个是 如果每一次你使用一个卷积操作,
你的图像都会缩小 例如你从 6x6 降维到 4x4 你做不了几次卷积,你的图片就会变得非常小 也许它会缩小到只有1x1或者别的什么 所以也许你并不希望 每次你想检测边界或者其他的特征时,都缩小你的图片 这就是一个缺陷 第二个缺陷是 图片角落或者边际上的像素 只会在输出中被使用一次 因为它只通过那个3x3的过滤器(filter)一次 然而图片中间的一个像素,比如这一个 会有许多3x3的过滤器(filter)在那个像素上重叠 所以相对而言 角落或者边界上的像素被使用的次数少很多 你丢失了许多图片上靠近边界的信息 所以为了同时解决上述的两个问题 一是输出的逐渐缩小 这在当你构建非常深的神经网络时 你会发现为什么你不希望每一步都缩小图片 因为比如你有一个一百层的深度网络 如果它每一层都会缩小(图片)一点 这样一百层之后你会得到一个非常小的图片 这是一个问题 另一个(问题)是丢失了许多图片边界上的信息 所以为了消除这两个问题 你能做的是在使用卷机操作前 你可以填充(pad)图片 在这种情况下 让我们假设你用一个额外的边缘(border)填充图片 在边界周围用一个1个像素的大小的额外边缘 如果你这么做 你现在的输入已经变成一个通过填充得到的 8x8 图片 而不是 6x6 图片 如果你使用一个3x3过滤器卷积一个8x8图片 现在结果是一个6x6的图片而不是 4x4 所以你通过填充保持了图片的原始大小 6x6 通常当你填充时 你使用0来填充 如果p是填充的数量 所以 在这种情况下 p=1 因为我们使用了一个1像素的额外边缘填充了一圈 这样输出变成了 (n+2p-f+1) x (n+2p-f+1) 所以这个变成了 (6+21-3+1) x (6+21-3+1) 这是(6+2-3+1) = 6 这样你得到了一个 6x6 的输出 保持了初始图片的大小 因此这个绿色的像素事实上影响了 所有这些过滤器的输出 这样的效果是大大降低了 之前的那种边界和角落信息被忽略的严重程度 并且我在这里展示了 使用单个像素填充边缘的效果 如果你需要,你也可以用两个像素填充边缘 这样子你再添加一个额外的边缘 如果你愿意 这里你甚至可以使用更多的像素来填充 我在这里画的是 这里是一个p等于2的填充 到底需要填充多少 我们有两个常见的选择 即valid卷积和same卷积 不是什么很棒的名字
不过valid卷积 基本上意思是没有填充 因此在这种情况下 当你用一个 fxf 过滤器去卷积一个 nxn 的图片 你会得到一个 (n-f+1) x (n-f+1) 维度的输出 这就像是我们在之前的视频中使用的例子 我们用一个3x3的过滤器卷积一个6x6的图片 得到一个4x4的输出 另一个最常用的填充选择 叫做same卷积 意思是你选择的填充将使得 输出大小等于输入大小 所以当我们看一下这个公式 当你用p个像素填充 这就像是n变成了n+2p 然后其余的不变 对吧? 减去f加上1 所以当我们有一个nxn的图片 并且边缘四周的填充是p个像素 这样输出的大小是n+2p-f+1 如果你希望n+2p-f+1=n 即输出和输入大小一致 如果你用这个式子然后解方程 我想 两边n抵消了 然后如果你解p 这个意味着p=(f-1)/2 所以当f是奇数时 这样通过选择填充的大小 你可以保证输出和输入的大小相同 这就是为什么 比如说 当过滤器是3x3时 就像在之前的幻灯片中 可以使输出输入大小相同的填充是 (3-1)/2=1 另一个例子是 如果你的过滤器是5x5 就是说f=5 如果带入这个式子 你会发现需要使用2个像素大小的填充 才能使得在过滤器是5x5的情况下 输出输入相同 通常在计算机视觉(computer vision)领域 f基本上是使用奇数 事实上几乎永远是奇数 并且你很少看到偶数大小的 计算机视觉使用的过滤器 并且我想有两个原因导致这个现象 一是如果f是偶数 你会需要一些不对称的填充 所以只有当f是奇数时 这种same卷积会产生 在四周有相同的维度的一个自然的填充区域 而不是在左边多填充在右边少填充 或者别的不对称的填充 其次当你有一个奇数大小的过滤器 比如3x3或者5x5 这样这可以有一个中心位置 有时候在计算机视觉领域 有一个特殊点是很好的 有一个这样的像素是很好的 你可以称之为中心像素 这样你就可以描述你过滤器的位置 也许这些都不是 为什么f基本上永远使用奇数的很好的理由 但是如果你去读一些卷积相关的文献 你会发现3x3的过滤器非常常见 你会看见一些5x5,7x7 事实上有时候 之后我们会讲到1x1过滤器和它的原理 但是只是约定俗成 我建议你也使用奇数大小的过滤器 我想就算你使用一个偶数f 你也许能得到不错的结果 但是如果你坚持计算机视觉的传统 我一般只用奇数f 所以现在你知道了如何使用填充卷积 为了指定你卷积操作的填充 你可以指定p的大小 或者你可以只说这是一个valid卷积 意味着p=0 或者你可以说这是一个same卷积 意味着使用足够的填充 使得输出输入的大小相等 所以这就是填充 在下一个视频,让我们来讲讲如何实现步幅(stride)卷积