函数conv2d参数stride,padding的理解

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

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

  1. tf . nn . conv2d (
  2.     input ,
  3.     filter ,
  4.     strides ,
  5.     padding ,
  6.     use_cudnn_on_gpu = True ,
  7.     data_format = 'NHWC' ,
  8.     dilations =[ 1 , 1 , 1 , 1 ],
  9.     name = None
  10. )

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:


变成了5x5,结果如下:


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


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


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


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


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


再把padding改为 VALID瞧瞧:


再做卷积,

猜你喜欢

转载自blog.csdn.net/liangjiubujiu/article/details/80981945