Tensorflow中same padding和valid padding

来自文档

  • Same Convolution Padding

我之前学习吴恩达老师的课程时,了解到的same padding是指在输入周围填充0,以使卷积操作后输入输出大小相同。而在tensorflow中的same padding却不是这样的。

要理解tensorflow中的same padding是如何操作的,先考虑一维卷积的情况。

ni和no分别表示输入和输出的大小,k为kernel大小,s为stride步长。那么在same padding中,no由ni和s二者确定:no = ceil(ni / s)

比如,假设ni为11,s为2,那么就得到no为6。而s若为1,则输入输出大小相等。

现在已经确定好了输出no的大小,接下来就要确定如何对输入ni进行pad来得到目标输出大小。也就是要找到满足下面公式的pi:

上取整

现在的目标就是要找到最小的pi(因为pi有多个值可满足上诉公式)。

一般,在上取整ceil(x / a) = b(a > 0)中,意味着b - 1 < x / a <= b。满足该条件的最小整数x = a(b - 1) + 1。
因为 a(b - 1) < x <= ab,a、b都为整数,所以x最小就为a(b - 1) + 1。

那么对于pi也如此,即ni + pi - k + 1 = s(no - 1) + 1。

那么pi = s(no - 1) + k - ni。

对于上面的例子:ni = 11,s = 2,no = 6,则pi = k - 1。可以手动算一下k为各个值时卷积运算的情况。

但是对于上面的公式,在有的情况下,pi可能得到负值,比如ni = 10,s = 2,k = 1,此时不用padding也能得到no = 5,但根据公式可得到pi = -1。虽然在ni上减去1也可以得到同样的结果,但再减去1显然是多此一举的。所以修改pi公式如下:

对于该公式还要再分为两种情况讨论......:ni能整除s和ni不能整除s。

  1. mod(ni , s) = 0时

这时,ni / s = no。pi = max(k - s, 0)。

  1. mod(ni , s) != 0时

此时,ni可写为下面的公式(相当于将ni拆为两部分:可以整除s的部分和不能整除s的部分):

因为mod(ni , s) != 0,所以中间括号中的值为1。也就简化为下面的公式:

移项,则,no = ceil(ni / s) = (ni + s - (ni mod s)) / s。将其带入pi,得到:

将两种情况总结如下,得到最终的same padding的pad情况:

一维情况下的same padding清楚了,对于二维情况下面就直接贴代码了:

# 先确定输出维度,记住是上取整
out_height = ceil(float(in_height) / float(strides[1]))
out_width  = ceil(float(in_width) / float(strides[2]))

# 上面的公式
if (in_height % strides[1] == 0):
  pad_along_height = max(filter_height - strides[1], 0)
else:
  pad_along_height = max(filter_height - (in_height % strides[1]), 0)
if (in_width % strides[2] == 0):
  pad_along_width = max(filter_width - strides[2], 0)
else:
  pad_along_width = max(filter_width - (in_width % strides[2]), 0)

# 因为pad是在上下、左右四侧pad。所以当pi不为偶数时要分配下
# 这里是当pi为奇数时,下侧比上侧多一,右侧比左侧多一。
#  Note that this is different from existing libraries such as cuDNN and Caffe, which explicitly specify the number of padded pixels and always pad the same number of pixels on both sides.
pad_top = pad_along_height // 2
pad_bottom = pad_along_height - pad_top
pad_left = pad_along_width // 2
pad_right = pad_along_width - pad_left

其实在搭建网络是不需要关心他是怎么padding的,关键是要知道在same padding中no = ceil(ni / s),好确定输出维度。

  • Valid Convolution Padding

很简单,对于valid padding来说就是在卷积运算前,对输入没有pad操作。输出由下公式确定:

no = ceil( (ni - k + 1) / s )

对于二维情况:

out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width  = ceil(float(in_width - filter_width + 1) / float(strides[2]))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,320评论 0 10
  • block是带有局部变量的匿名函数,差不多跟C语言中的函数指针类似,可以当做参数传来传去,而且可以没有名字。同时也...
    6灰太狼9阅读 256评论 0 0
  • 晚上,我带着女儿去文具批发店买笔袋,她又相中一盒自动旋转蜡笔24色标价15元,另有12色的标价10元,女儿选择了2...
    愿你我都幸福阅读 1,162评论 0 1
  • 2017.12.3晴 今天上的早班加班加到4点才回家,刚一进门儿子就上来抱着我说“妈妈你终于回来啦”。昨天就吵着让...
    张宇轩妈妈阅读 263评论 0 0
  • 写在前面 青葱岁月几点笑事,茫然前行许多思考。 大学生活中,一些有趣的事,一些有趣的人,一些思考和忧愁。 那些...
    谷乘风阅读 203评论 0 1