今天读YOLO v3源码的时候发现了一个有趣的事情,我们知道YOLO V3是用卷积来实现下采样,我们看这段代码:
if downsample:
pad_h, pad_w = (filters_shape[0] - 2) // 2 + 1, (filters_shape[1] - 2) // 2 + 1
paddings = tf.constant([[0, 0], [pad_h, pad_h], [pad_w, pad_w], [0, 0]])
input_data = tf.pad(input_data, paddings, 'CONSTANT')
strides = (1, 2, 2, 1)
padding = 'VALID'
- 这段代码是先利用tf.pad()函数来手动给feature map往外填零,再用的步长,padding为VALID的方式进行卷积来实现下采样,我看完这段代码的第一反应是为什么不直接用,padding为SAME的方式来下采样,搞这么麻烦干什么?于是我自己算了一次:
- 用YOLO v3的背景来做计算:卷积核为,输入数据假定,首先我们使用代码的这个方法计算一下卷积之后的高度与宽度:
- 填充的宽高:,注意这里是向下取整。所以填充完数据维度变成
- 卷积后的长宽:
- 直接使用SAME方式的padding来卷积,卷积后的长宽就是
- 是的,两者的结果是一样的,那一样的结果,能两行代码搞定的事为什么要多用两行呢,经过我跟一位小伙伴的讨论,觉得最有可能的想法就是这样的写法可以在补零的时候更自由,可以选择在不同的维度进行补零,而直接用SAME方式的padding的补零是系统指定的,可能在一些特殊情况下需要特殊的补零方式,作者习惯了这种可扩展性更高的写法,更准确地说,他是为了装逼(逃
网友评论