关于TensorFlow中函数conv2d参数stride,padding的理解

刚刚接触TensorFlow,很多地方不是很理解,虽然之前有过相关的理论学习,但具体的代码实现,还需破费心力。

TensorFlow中函数conv2d主要实现了输入张量与设定卷积核的卷积操作,其函数形式如下:

tf.nn.conv2d(
    input,
    filter,
    strides,
    padding,
    use_cudnn_on_gpu=True,
    data_format='NHWC',
    dilations=[1, 1, 1, 1],
    name=None
)

input,filter自然是设定的输入和卷积核了,参数strides,padding分别决定了卷积操作中滑动步长和图像边沿填充的方式。

看下strides官方解释:


其为长度为4的一阶张量,并且要求strides[0]=strides[3]=1,strides[1],strides[2]决定卷积核在输入图像in_hight,in_width方向的滑动步长,而通过图像卷积的过程可以知道,卷积核的大小和图像的大小有时候比不是完全匹配,比如图像大小为5x5,卷积核大小为3x3,滑动步长为3时会涉及到图像卷积过程中边界如何填充的问题,padding参数的两个值SAME,VALID决定了其填充方式,通过代码验证其不同的工作方式

padding = VALID:

关于TensorFlow中函数conv2d参数stride,padding的理解_第1张图片

可以看到当用5x5 的卷积核对28x28的图像进行卷积,采用padding=VALID模式,步长为5,那么最后每个方向会余下3个像素,而VALID模式中会直接舍弃,这样每个方向上的5个元素会变成一个元素,所以最终卷积后的图像大小变成了5x5,结果如下:

关于TensorFlow中函数conv2d参数stride,padding的理解_第2张图片

padding = SAME

这种模式下,对于原始图像与卷积核不匹配的情况,就要对图像的边界做一些填充,具体的填充方式和所差的元素个数有关,一种一种试一试:

关于TensorFlow中函数conv2d参数stride,padding的理解_第3张图片

同样是产生28x28的全1图像,然后用全1的5x5卷积核做卷积,那每个方向差两个元素,通过计算结果可以看到是在每个方向的两端各补了一个0,形成30x30,四周都是0的图像。那如果差1个元素呢?

关于TensorFlow中函数conv2d参数stride,padding的理解_第4张图片

比较上述结果第一行,第一列不同,其余相同,那么就是在每行每列的最后补了一个0。继续差三个元素呢?

关于TensorFlow中函数conv2d参数stride,padding的理解_第5张图片

同样是比较结果,通过元素的值可以推测出其是在每个方向的开头补了一个0,最后补了两个0,那么差4个元素呢?

关于TensorFlow中函数conv2d参数stride,padding的理解_第6张图片

结果显示了什么?首尾各补两个0。那么通过上述验证是不是得到了些规律呢?可见当差偶数个元素是首尾各补一半,差奇数个时前边补奇数个,后边补偶数个。当然具体差多少元素和选定的卷积核大小以及滑动步长密切相关。那么滑动步长又有哪些影响呢?如果改成滑动步长为1,看看验证的结果:

关于TensorFlow中函数conv2d参数stride,padding的理解_第7张图片

再把padding改为 VALID瞧瞧:

关于TensorFlow中函数conv2d参数stride,padding的理解_第8张图片

总结一下看到了什么,卷积核大小,滑动步长直接影响最后的卷积结果的大小,且padding为SAME模式时,先对原图像进行填充再做卷积,填充值须根据卷积核大小及滑动步长决定,当滑动步长大于1时:填充数=K-I%S(K:卷积核边长,I:输入图像边长,S:滑动步长),滑动步长为1时,直接卷积核边长减1,而padding为VALID模式时,很简单粗暴直接从原始图像的首段开始卷积,到最后不能匹配卷积核的部分直接舍去,至于两种模式会有怎样的差别,后续可进行进一步的验证。






你可能感兴趣的:(TensorFlow相关)