美文网首页
用SAME方式padding来卷积实现下采样与tf.pad后用V

用SAME方式padding来卷积实现下采样与tf.pad后用V

作者: CristianoC | 来源:发表于2020-02-06 21:36 被阅读0次

    今天读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往外填零,再用(1,2,2,1)的步长,padding为VALID的方式进行卷积来实现下采样,我看完这段代码的第一反应是为什么不直接用(1,2,2,1),padding为SAME的方式来下采样,搞这么麻烦干什么?于是我自己算了一次:
    • 用YOLO v3的背景来做计算:卷积核为3×3,输入数据假定(10,26,26,3),首先我们使用代码的这个方法计算一下卷积之后的高度与宽度:
    1. 填充的宽高:(3//2+1)=1,注意这里是向下取整。所以填充完数据维度变成(10,28,28,3)
    2. 卷积后的长宽:(28-3[卷积核的长宽])/2[stride]+1=13
    • 直接使用SAME方式的padding来卷积,卷积后的长宽就是26/2[stride]=13
    • 是的,两者的结果是一样的,那一样的结果,能两行代码搞定的事为什么要多用两行呢,经过我跟一位小伙伴的讨论,觉得最有可能的想法就是这样的写法可以在补零的时候更自由,可以选择在不同的维度进行补零,而直接用SAME方式的padding的补零是系统指定的,可能在一些特殊情况下需要特殊的补零方式,作者习惯了这种可扩展性更高的写法,更准确地说,他是为了装逼(逃

    相关文章

      网友评论

          本文标题:用SAME方式padding来卷积实现下采样与tf.pad后用V

          本文链接:https://www.haomeiwen.com/subject/vuqpxhtx.html