conv2d_transpose如何在Tensorflow中工作

时间:2018-08-25 21:19:07

标签: python tensorflow neural-network deep-learning conv-neural-network

我正在使用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(有精美的图画)。

最后,我的问题是:我的论点有什么问题,为什么权重不是“移置并旋转”的?

0 个答案:

没有答案