如何理解tensorflow中的conv2d_transpose
How to understand the conv2d_transpose in tensorflow
以下是对conv2d_transpose的测试。
import tensorflow as tf
import numpy as np
x = tf.constant(np.array([[
[[-67], [-77]],
[[-117], [-127]]
]]), tf.float32)
# shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
f = tf.constant(np.array([
[[[-1]], [[2]], [[-3]]],
[[[4]], [[-5]], [[6]]],
[[[-7]], [[8]], [[-9]]]
]), tf.float32)
conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 5, 5, 1), strides=[1, 2, 2, 1], padding='VALID')
结果:
tf.Tensor(
[[[[ 67.]
[ -134.]
[ 278.]
[ -154.]
[ 231.]]
[[ -268.]
[ 335.]
[ -710.]
[ 385.]
[ -462.]]
[[ 586.]
[ -770.]
[ 1620.]
[ -870.]
[ 1074.]]
[[ -468.]
[ 585.]
[-1210.]
[ 635.]
[ -762.]]
[[ 819.]
[ -936.]
[ 1942.]
[-1016.]
[ 1143.]]]], shape=(1, 5, 5, 1), dtype=float32)
根据我的理解,它应该像 doc
中的图 4.5 中描述的那样工作
因此第一个元素(conv[0,0,0,0])应该是-67*-9=603。为什么结果是67?
结果可以用下图来解释:。但是为什么卷积核是反的呢?
为了更好地解释,我做了一个draw.io
图来解释你得到的结果。
我想上面的插图可能有助于解释转置转换的第一个元素的原因。特征图是 67
.
需要注意的关键事项:
- 与传统卷积不同,在转置卷积中,过滤器的每个元素都与输入特征图的一个元素相乘,这些单独乘法的结果和中间特征图被叠加彼此创建最终的特征图。
stride
确定叠加层之间的距离。在我们的例子中,stride = 2,因此在每次与原始下采样特征图卷积后,过滤器在 x
和 y
维度上移动 2。
以下是对conv2d_transpose的测试。
import tensorflow as tf
import numpy as np
x = tf.constant(np.array([[
[[-67], [-77]],
[[-117], [-127]]
]]), tf.float32)
# shape = (3, 3, 1, 1) -> (height, width, input_channels, output_channels) - 3x3x1 filter
f = tf.constant(np.array([
[[[-1]], [[2]], [[-3]]],
[[[4]], [[-5]], [[6]]],
[[[-7]], [[8]], [[-9]]]
]), tf.float32)
conv = tf.nn.conv2d_transpose(x, f, output_shape=(1, 5, 5, 1), strides=[1, 2, 2, 1], padding='VALID')
结果:
tf.Tensor(
[[[[ 67.]
[ -134.]
[ 278.]
[ -154.]
[ 231.]]
[[ -268.]
[ 335.]
[ -710.]
[ 385.]
[ -462.]]
[[ 586.]
[ -770.]
[ 1620.]
[ -870.]
[ 1074.]]
[[ -468.]
[ 585.]
[-1210.]
[ 635.]
[ -762.]]
[[ 819.]
[ -936.]
[ 1942.]
[-1016.]
[ 1143.]]]], shape=(1, 5, 5, 1), dtype=float32)
根据我的理解,它应该像 doc
中的图 4.5 中描述的那样工作因此第一个元素(conv[0,0,0,0])应该是-67*-9=603。为什么结果是67?
结果可以用下图来解释:
为了更好地解释,我做了一个draw.io
图来解释你得到的结果。
我想上面的插图可能有助于解释转置转换的第一个元素的原因。特征图是 67
.
需要注意的关键事项:
- 与传统卷积不同,在转置卷积中,过滤器的每个元素都与输入特征图的一个元素相乘,这些单独乘法的结果和中间特征图被叠加彼此创建最终的特征图。
stride
确定叠加层之间的距离。在我们的例子中,stride = 2,因此在每次与原始下采样特征图卷积后,过滤器在x
和y
维度上移动 2。