Tensorflow函数tf.nn.conv2d()的理解

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
除去name参数用以指定该操作的name,与方法有关的一共五个参数:

第一个参数input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一

第二个参数filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维

第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4

第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式(后面会介绍)

第五个参数:use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true

import tensorflow as tf

input1 = tf.Variable(tf.random_normal([1, 3, 3, 5]))
filter1 = tf.Variable(tf.random_normal([1, 1, 5, 1]))
op = tf.nn.conv2d(input1, filter1, strides=[1, 1, 1, 1], padding='VALID')

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(input1))
    print(sess.run(filter1))
    print(sess.run(op))

结果

[[[[ 1.45758533 -0.09802289 -1.59479737 -0.16897383  0.14859726]
   [ 1.28683913  0.81622362 -0.25950107 -1.59787464 -1.53971493]
   [-1.50767624 -0.80565053  0.08329388 -1.13792372 -0.26977447]]

  [[ 0.14864756 -0.28723699 -1.86747098  0.12153267  1.08284247]
   [-0.35012725 -0.14097945 -1.10806382  1.75250912 -1.18908668]
   [-1.41720486  0.30819464 -0.38090637  0.86877841 -0.47367322]]

  [[-0.15385917 -1.48778439 -0.83307278 -1.77908075  1.23309827]
   [-0.35756287 -0.93248796  0.52480459 -1.56932425 -0.73900026]
   [ 0.44062671 -0.69042021  0.9337461   0.09909598  0.16418104]]]]
[[[[ 0.44201431]
   [-0.73989844]
   [ 1.08442032]
   [ 0.24145503]
   [-0.75509739]]]]
[[[[-1.16563511]
   [ 0.46029031]
   [-0.05104074]]

  [[-2.53519988]
   [ 0.06897072]
   [-0.70007986]]

  [[-1.23127699]
   [ 1.28010321]
   [ 1.618132  ]]]]

肯定有人好奇这些结果是怎么出来的。

[[ 1.45758533 -0.09802289 -1.59479737 -0.16897383  0.14859726]
   [ 1.28683913  0.81622362 -0.25950107 -1.59787464 -1.53971493]
   [-1.50767624 -0.80565053  0.08329388 -1.13792372 -0.26977447]]

上面那个3*5张量可以用下图表示
在这里插入图片描述

[[-1.16563511]
   [ 0.46029031]
   [-0.05104074]]

结果矩阵的第一个张量可以用下面图表示
在这里插入图片描述
input1那个张量用图表示如下
在这里插入图片描述
在这里插入图片描述
下面就是input1和filiter进行conv2d运算的过程
在这里插入图片描述
在这里插入图片描述
有不当之处请指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值