我正在使用FCN进行图像分割并使用Tensorflow实现它 . 该网络使用一些"upsampling"层,实际上是"conv2d_transpose" . 我需要知道函数是如何工作的,因为我想在C中自己重新实现"conv2d_transpose"函数 .

对于我的应用程序,我需要扩展一个形状为[1,16,16,6]的输入,其中1为批量大小,16为宽度/高度,6为通道数,为具有形状的输出[ 1,32,32,6] . 我正在使用具有这种形状的权重[4,4,6,6],其中4是内核大小,6是输入通道和输出通道,还有SAME填充 .

  • 输入[1,16,16,6]

  • 输出[1,32,32,6]

  • 重量[4,4,6,6]

  • 大步[1,2,2,1]

  • 填充相同

所以,经过一些研究,我发现了这个topic,这个one,但我仍然很困惑 . 看起来这个函数的工作原理如下:

conv2d_transpose()只需转置权重并将它们翻转180度 . 然后它应用标准的conv2d() . “Transposes”实际上意味着它改变了权重张量中“列”的顺序 .

因此,为了测试这个理论,我尝试了一小段代码,但看起来它没有移动权重并将它们翻转180.我认为经过大量研究后,我仍然遗漏了一些东西......

为了便于理解,我使用了以下配置:

  • 输入[1,2,2,2]

  • 输出[1,4,4,2]

  • 重量[4,4,2,2]

  • 大步[1,2,2,1]

  • 填充相同

这是代码:

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(画面漂亮) .

最后,我的问题是:我的论点出了什么问题,为什么重量不是“换位和旋转”?