tf.nn.conv2d理解(转载)

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

input:

张量[batch, in_height, in_width, in_channels]

过滤器:

[filter_height, filter_width, in_channels, out_channels]

strides:

strides在官方定义中是一个一维具有四个元素的张量,其规定前后必须为1,所以我们可以改的是中间两个数。

中间两个数分别代表了水平滑动和垂直滑动步长值。

在卷积核移动逐渐扫描整体图时候,因为步长的设置问题,可能导致剩下未扫描的空间不足以提供给卷积核的大小

比如有图大小为5*5,卷积核为2*2,步长为2,卷积核扫描了两次后,剩下一个元素,不够卷积核扫描了。

这个时候就在后面补零,补完后满足卷积核的扫描,这种方式就是same。如果说把刚才不足以扫描的元素位置抛弃掉,就是valid方式。

举例 
输入是[1,3,3,1],代表1个图像,大小3x3,1个通道 

filter是[2,2,1,1],代表filter的大小是2x2,输入通道通道是1,与图片通道相同,输入通道也是1。

步长是1,padding是VALID 
这种情况下,输出是1x2x2x1,其中2=(3-2)/1+1,即(图片大小-filter大小)/步长+1。 

input = tf.constant([[[[1],[2],[ 3]],
                    [[4],[5],[6 ]],
                    [[ 7],[8],[9]]]],dtype=tf.float32)
filter = tf.constant([[[[1]], [[2]]], [[[3]], [[4]]]],dtype=tf.float32) # filter.shape=2,2,1,1
op = tf.nn.conv2d(input,filter,strides = [1,1,1,1],padding ='VALID')
with tf.Session() as sess:
    sess.run(init)
    result = sess.run(op)
    print(result)

输出:



当padding=SAME时,输入与输出形状相同,如下面代码所示,输出形状输出是1x3x3x1。


转载地址:

https://blog.csdn.net/u013713117/article/details/55517458/

猜你喜欢

转载自blog.csdn.net/m0_37407756/article/details/80805861