我正在使用FCN进行图像分割,并使用Tensorflow实施它。该网络使用一些“上采样”层,实际上是“ conv2d_transpose”。我需要知道该函数的真正工作原理,因为我想用C ++自己重新实现“ conv2d_transpose”函数。
对于我的应用程序,我需要将输入扩展为[1,16,16,6]形状,其中1是批处理大小,16是宽度/高度,6是通道数,使用形状[1、32、32、6]。我正在使用形状为[4,4,6,6]的权重,其中4是内核大小,6是输入通道和输出通道,以及相同的填充。
input [1, 16, 16, 6]
output [1, 32, 32, 6]
weights [4, 4, 6, 6]
strides [1, 2, 2, 1]
padding SAME
因此,经过一些研究,我发现了这个topic和这个one,但是我仍然很困惑。看来该功能是这样的:
conv2d_transpose()只是将权重转置并将其翻转180度。然后,它应用标准的conv2d()。实际上,“转置”意味着它会改变权重张量中“列”的顺序。
因此,为了测试该理论,我尝试了一小段代码,但是看起来它没有调换权重并将其翻转180。我认为经过大量研究,我仍然缺少一些东西。 ..
为使示例更容易理解,我使用了以下配置:
input [1, 2, 2, 2]
output [1, 4, 4, 2]
weights [4, 4, 2, 2]
strides [1, 2, 2, 1]
padding SAME
这是代码:
import tensorflow as tf
import numpy as np
channels = 2
img_width = 2
img_height = 2
kernel = 4
np.random.seed(10)
w = np.zeros((kernel, kernel, channels, channels))
for i in range(kernel):
w[i] += i+1
img = np.zeros((1, img_height, img_width, channels))
img[0][0][0][0] = 1
print(img)
print(w)
weights = tf.constant(w)
inp = tf.constant(img)
real_output = tf.nn.conv2d_transpose(
inp,
weights,
output_shape=[1,img_height*2,img_width*2,channels],
strides=[1,2,2,1],
padding='SAME'
)
with tf.Session() as sess:
print(sess.run([real_output]))
结果是here(有精美的图画)。
最后,我的问题是:我的论点有什么问题,为什么权重不是“移置并旋转”的?