我正在使用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(画面漂亮) .
最后,我的问题是:我的论点出了什么问题,为什么重量不是“换位和旋转”?