tensorflow-yolov3
tensorflow-yolov3 copied to clipboard
卷积运算中,在stride>1时,关于conv2d的padding的问题。
查看了作者的代码,在stride>1的时候,是先对input进行padding,然后在tf.nn.conv2d中使用padding='VALID'的方式进行卷积。 请问为什么不直接使用tf.nn.conv2d中padding='SAME'的padding方式进行呢?似乎两种方式的效果差别不会很大,仅仅是填充的位置稍微改变。 是因为darknet作者用的前一种方式吗?
@YunYang1994
我也想了很久,自己试了一下,用作者的代码训练到test_loss不降后,在stride>1的代码部分,改成SAME的机制。loss几乎没有上升或变化,感觉差不多。不知道是不是实际工程使用的问题。使用3×3卷积,input边是奇数时,这两种没区别,但是边是偶数是,就是位置的稍微改变了。
我也想了很久,自己试了一下,用作者的代码训练到test_loss不降后,在stride>1的代码部分,改成SAME的机制。loss几乎没有上升或变化,感觉差不多。不知道是不是实际工程使用的问题。使用3×3卷积,input边是奇数时,这两种没区别,但是边是偶数是,就是位置的稍微改变了。
后来我考虑了一下。其实都只是提取特征的方式而已,只要训练和推理所用的方法是一致的,任选其一即可,不用纠结于此。 这里的作者这样写,应该是沿袭了darknet原版作者的写法。
@KoapT
根据 outputSize = (W - F + 2P)/S + 1 这个公式,我觉得添加 padding 只不过是为了让 outputSize 是 inputSize 的 1/2,从而实现 downsample,这种方式进行 conv 的时候,stride = 2。
如果先进行 SAME padding 的卷积,再 2x2 的 down size pooling,outputSize 也可以是 inputSize 的 1/2,但是这时候 stride = 1。
两者或有差别,我没试过,不清楚。
@DavidLeon777 不知道你改成 SAME 的时候,有没有进行 2x2 的 downsample?
@KoapT 根据
outputSize = (W - F + 2P)/S + 1这个公式,我觉得添加 padding 只不过是为了让 outputSize 是 inputSize 的 1/2,从而实现 downsample,这种方式进行 conv 的时候,stride = 2。 如果先进行 SAME padding 的卷积,再 2x2 的 down size pooling,outputSize 也可以是 inputSize 的 1/2,但是这时候 stride = 1。 两者或有差别,我没试过,不清楚。 @DavidLeon777 不知道你改成 SAME 的时候,有没有进行 2x2 的 downsample?
额。。。stride=2,padding='SAME'就是2倍下采样了,作者代码只是在stride=2的时候选择了手动padding而没有用tf的默认padding方式。两者区别很小,做实验试试就可以看到,这个问题其实没必要讨论了。 这跟你说的pool下采样没关系哈。。