tf.reshape()函数是怎样将一个一维张量变更为适合tf.nn.conv2d()运算的4维张量的(输入图像的通道数为2)?

初读代码,不太理解tf.reshape()函数是怎样将一个一维张量变更为适合tf.nn.conv2d()运算的4维张量的(输入图像的通道数为2)。

写了一个程序验证一下,终于搞明白这个通道数为2的输入图像时怎样建立的。

 

假设,输入的一维张量为:[1,2,3,4,5,6,7,8],过滤器的一维张量也是[1,2,3,4,5,6,7,8],执行tf.reshape()函数,为了满足tf.nn.conv2d()函数输入参数的要求,具体的执行函数如下:

input = tf.reshape(x, [1, 2, 2, 2])
filter = tf.reshape(f, [2, 2, 2, 1])

我们用图说明一下,输入图片input的变化如下:

tf.reshape()函数是怎样将一个一维张量变更为适合tf.nn.conv2d()运算的4维张量的(输入图像的通道数为2)?_第1张图片

过滤器filter的变化如下:

tf.reshape()函数是怎样将一个一维张量变更为适合tf.nn.conv2d()运算的4维张量的(输入图像的通道数为2)?_第2张图片

那么,

padding = 'VALID'时的2D卷积结果就是[204];

padding = 'SAME'时的2D卷积结果就是[204,94,70,23]。

具体的tf.nn.conv2d()函数的运算过程(输入图像的通道数为1)请参考:

https://blog.csdn.net/weixin_41943311/article/details/94570067

输入图像的通道数为2时,每个通道的输入input与对应的过滤器filter做卷积,然后把两个结果相加作为输出。在这个例子里,因为过滤器只有1个(组),因此输出的通道也只有1个。

代码如下:

import tensorflow as tf
import numpy as np

x = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6., 7.0, 8.0], dtype='float32')
f = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0], dtype='float32')

input = tf.reshape(x, [1, 2, 2, 2])
filter = tf.reshape(f, [2, 2, 2, 1])

op = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')
init = tf.global_variables_initializer

with tf.Session() as sess:

    print("result")
    result = sess.run(op)
    print(result.shape)
    print(result)


输出为:

result

(1, 2, 2, 1)

[[[[204.]

   [ 94.]]

  [[ 70.]

   [ 23.]]]]

(完)

你可能感兴趣的:(tf.reshape()函数是怎样将一个一维张量变更为适合tf.nn.conv2d()运算的4维张量的(输入图像的通道数为2)?)