赞
踩
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:
变成了5x5,结果如下:
这种模式下,对于原始图像与卷积核不匹配的情况,就要对图像的边界做一些填充,具体的填充方式和所差的元素个数有关,一种一种试一试:
同样是产生28x28的全1图像,然后用全1的5x5卷积核做卷积,那每个方向差两个元素,通过计算结果可以看到是在每个方向的两端各补了一个0,形成30x30,四周都是0的图像。那如果差1个元素呢?
比较上述结果第一行,第一列不同,其余相同,那么就是在每行每列的最后补了一个0。继续差三个元素呢?
同样是比较结果,通过元素的值可以推测出其是在每个方向的开头补了一个0,最后补了两个0,那么差4个元素呢?
结果显示了什么?首尾各补两个0。那么通过上述验证是不是得到了些规律呢?可见当差偶数个元素是首尾各补一半,差奇数个时前边补奇数个,后边补偶数个。当然具体差多少元素和选定的卷积核大小以及滑动步长密切相关。那么滑动步长又有哪些影响呢?如果改成滑动步长为1,看看验证的结果:
再把padding改为 VALID瞧瞧:
总结一下看到了什么,卷积核大小,滑动步长直接影响最后的卷积结果的大小,且padding为SAME模式时,先对原图像进行填充,再做卷积,填充值须根据卷积核大小及滑动步长决定,当滑动步长大于1时:填充数=K-I%S(K:卷积核边长,I:输入图像边长,S:滑动步长);能除尽时,填充数=K-S(K:卷积核边长,I:输入图像边长,S:滑动步长);滑动步长为1时,直接卷积核边长减1,而padding为VALID模式时,很简单粗暴直接从原始图像的首段开始卷积,到最后不能匹配卷积核的部分直接舍去,至于两种模式会有怎样的差别,后续可进行进一步的验证。
总结一下看到了什么,卷积核大小,滑动步长直接影响最后的卷积结果的大小,且padding为SAME模式时,先对原图像进行填充,再做卷积,填充值须根据卷积核大小及滑动步长决定,
I%S!=0
填充数=K-I%S(K:卷积核边长,I:输入图像边长,S:滑动步长)
I%S==0
填充数=K-S(K:卷积核边长,I:输入图像边长,S:滑动步长)
转载自:https://blog.csdn.net/qq_17272679/article/details/79591540
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。