tensorflow-yolov3 icon indicating copy to clipboard operation
tensorflow-yolov3 copied to clipboard

卷积运算中,在stride>1时,关于conv2d的padding的问题。

Open KoapT opened this issue 6 years ago • 5 comments

查看了作者的代码,在stride>1的时候,是先对input进行padding,然后在tf.nn.conv2d中使用padding='VALID'的方式进行卷积。 请问为什么不直接使用tf.nn.conv2d中padding='SAME'的padding方式进行呢?似乎两种方式的效果差别不会很大,仅仅是填充的位置稍微改变。 是因为darknet作者用的前一种方式吗?

KoapT avatar Oct 21 '19 10:10 KoapT

@YunYang1994

KoapT avatar Oct 22 '19 01:10 KoapT

我也想了很久,自己试了一下,用作者的代码训练到test_loss不降后,在stride>1的代码部分,改成SAME的机制。loss几乎没有上升或变化,感觉差不多。不知道是不是实际工程使用的问题。使用3×3卷积,input边是奇数时,这两种没区别,但是边是偶数是,就是位置的稍微改变了。

DavidLeon777 avatar Nov 28 '19 03:11 DavidLeon777

我也想了很久,自己试了一下,用作者的代码训练到test_loss不降后,在stride>1的代码部分,改成SAME的机制。loss几乎没有上升或变化,感觉差不多。不知道是不是实际工程使用的问题。使用3×3卷积,input边是奇数时,这两种没区别,但是边是偶数是,就是位置的稍微改变了。

后来我考虑了一下。其实都只是提取特征的方式而已,只要训练和推理所用的方法是一致的,任选其一即可,不用纠结于此。 这里的作者这样写,应该是沿袭了darknet原版作者的写法。

KoapT avatar Nov 28 '19 03:11 KoapT

@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?

ylqi007 avatar Oct 28 '20 01:10 ylqi007

@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下采样没关系哈。。

KoapT avatar Oct 28 '20 03:10 KoapT