初读代码,不太理解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的变化如下:
过滤器filter的变化如下:
那么,
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.]]]]
(完)