都2021年了,不会还有人连深度学习还不了解吧-- Padding篇

Posted 奋斗丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了都2021年了,不会还有人连深度学习还不了解吧-- Padding篇相关的知识,希望对你有一定的参考价值。

导读

本篇文章主要介绍CNN中常见的填充方式Padding,Padding在CNN中用的很多,是CNN必不可少的组成部分,使用Padding的目的主要是为了调整输出的大小,是必须搞清楚的知识点。如果你想继续了解深度学习,那么请看下去吧!

目前深度学习系列已经更新了6篇文章,分别是激活函数篇卷积篇损失函数篇下采样篇评估指标篇,另有1篇保姆级入门教程,1篇总结性文章CNN中十大令人拍案叫绝的操作,想要入门深度学习的同学不容错过!

一、Padding介绍

1.1 什么是Padding

在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0、1等),这称为填充(padding),是卷积运算中经常会用到的处理。例如,向下列tensor中使用幅度为1像素为0的填充。

虚线部分表示是填充的数据,这里省略了填充的内容0。

1.2 为什么要使用Padding

  • 1.使用填充主要是为了调整输出的大小。比如,对大小为(4, 4)的输入数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小比输入大小缩小了 2个元素。这在反复进行多次卷积运算的深度网络中会成为问题。为什么呢?因为如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用卷积运算。为了避免出现这样的情况,就要使用填充。在刚才的例子中,将填充的幅度设为 1,那么相对于输入大小(4, 4),输出大小也保持为原来的(4, 4)。因此,卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。
  • 2.越是边缘的像素点,对于输出的影响越小,因为卷积运算在移动的时候到边缘就结束了。中间的像素点有可能会参与多次计算,但是边缘像素点可能只参与一次。所以结果可能会丢失边缘信息。使用Padding可以在一定程度上保留边界信息。

二、常见的Padding方式

这里我会以图示的方式尽量将每种填充方式都阐述清楚,CNN中用到的填充方式无非就是下面的四种,最常用的是填0的Padding,另镜面Padding在Unet论文中使用过,感兴趣的同学可以自行下载去阅读!

Unet:Unet论文链接

2.1 填0Padding

原tensor:

[[-0.1678, -0.4418,  1.9466],
 [ 0.9604, -0.4219, -0.5241],
 [-0.9162, -0.5436, -0.6446]]

经过Padding(幅度为2,填充为0)后:

[[ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
 [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
 [ 0.0000,  0.0000, -0.1678, -0.4418,  1.9466,  0.0000,  0.0000],
 [ 0.0000,  0.0000,  0.9604, -0.4219, -0.5241,  0.0000,  0.0000],
 [ 0.0000,  0.0000, -0.9162, -0.5436, -0.6446,  0.0000,  0.0000],
 [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000],
 [ 0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000,  0.0000]]

2.2 镜面Padding

原始tensor:

[[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]]

经过镜面Padding之后:

[[8., 7., 6., 7., 8., 7., 6.],
 [5., 4., 3., 4., 5., 4., 3.],
 [2., 1., 0., 1., 2., 1., 0.],
 [5., 4., 3., 4., 5., 4., 3.],
 [8., 7., 6., 7., 8., 7., 6.],
 [5., 4., 3., 4., 5., 4., 3.],
 [2., 1., 0., 1., 2., 1., 0.]]

通俗解释一下镜面Padding是如何实现的,其实原理也很简单,跟初中物理学过的镜面反射原理是一样的,分别以原始tensor的四条边为镜面,然后进行反射,即可得到镜面Padding之后的tensor了。

2.3 填连续值Padding

原始tensor:

[[ 1.6585,  0.4320],
 [-0.8701, -0.4649]]

经过Padding(幅度为2,填充为3.5)之后,变为下列所示的tensor:

[[ 3.5000,  3.5000,  3.5000,  3.5000,  3.5000,  3.5000],
 [ 3.5000,  3.5000,  3.5000,  3.5000,  3.5000,  3.5000],
 [ 3.5000,  3.5000,  1.6585,  0.4320,  3.5000,  3.5000],
 [ 3.5000,  3.5000, -0.8701, -0.4649,  3.5000,  3.5000],
 [ 3.5000,  3.5000,  3.5000,  3.5000,  3.5000,  3.5000],
 [ 3.5000,  3.5000,  3.5000,  3.5000,  3.5000,  3.5000]]

2.4 使用输入tensor的边缘Padding

原始tensor:

[[0., 1., 2.],
 [3., 4., 5.],
 [6., 7., 8.]]

经过Padding(幅度为2)后的tensor:

[[0., 0., 0., 1., 2., 2., 2.],
 [0., 0., 0., 1., 2., 2., 2.],
 [0., 0., 0., 1., 2., 2., 2.],
 [3., 3., 3., 4., 5., 5., 5.],
 [6., 6., 6., 7., 8., 8., 8.],
 [6., 6., 6., 7., 8., 8., 8.],
 [6., 6., 6., 7., 8., 8., 8.]]

文章持续更新,可以关注微信公众号【医学图像人工智能实战营】获取最新动态,一个专注于医学图像处理领域前沿科技的公众号。坚持以实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。更有上百部深度学习入门资料免费等你来拿,只有实践才能成长的更快,关注我们,一起学习进步~

计划

深度学习保姆级入门教程 – 论文+代码+常用工具
1个字,绝! – CNN中十大令人拍案叫绝的操作
都2021年了,不会还有人连深度学习还不了解吧?(一)-- 激活函数篇
都2021年了,不会还有人连深度学习还不了解吧?(二)-- 卷积篇
都2021年了,不会还有人连深度学习还不了解吧?(三)-- 损失函数篇
都2021年了,不会还有人连深度学习还不了解吧?(四)-- 上采样篇
都2021年了,不会还有人连深度学习还不了解吧?(五)-- 下采样篇
都2021年了,不会还有人连深度学习还不了解吧?(六)-- Padding篇
都2021年了,不会还有人连深度学习还不了解吧?(七)-- 评估指标篇
都2021年了,不会还有人连深度学习还不了解吧?(八)-- 优化算法篇
都2021年了,不会还有人连深度学习还不了解吧?(九)-- 注意力机制篇
都2021年了,不会还有人连深度学习还不了解吧?(十)-- 数据归一化篇

觉得写的不错的话,欢迎点赞+评论+收藏,欢迎关注我的微信公众号,这对我帮助真的很大很大很大!

以上是关于都2021年了,不会还有人连深度学习还不了解吧-- Padding篇的主要内容,如果未能解决你的问题,请参考以下文章

都2021年了,不会还有人连深度学习还不了解吧-- Padding篇

都2021年了,不会还有人连深度学习还不了解吧?-- 损失函数篇

都2021年了,不会还有人连深度学习还不了解吧-- 优化算法篇

都2021年了,不会还有人连深度学习还不了解吧-- 优化算法篇

都2021年了,不会还有人连深度学习还不了解吧-- 优化算法篇

都2021年了,不会还有人连深度学习都不了解吧- 激活函数篇