当前位置: 代码迷 >> 综合 >> tf.layers.conv2d_transpose反卷积输出尺寸的计算
  详细解决方案

tf.layers.conv2d_transpose反卷积输出尺寸的计算

热度:34   发布时间:2023-11-17 05:31:10.0

背景

今天研究了下tensorflow中反卷积输出尺寸的计算,使用的函数是tf.layers.conv2d_transpose。

函数用法

典型用法是这样

y = tf.layers.conv2d_transpose(x, 128, 5, strides=3, padding='valid')

x是输入的四维张量(批数量,长, 宽, 通道数),128是输出通道数,5表示卷积核边长(这里是卷积核是个正方形),strides是卷积步长,padding是对齐方式。

输出张量中,批数量不会变,通道数就是参数里的输出通道数,尺寸则需要计算。

反卷积的计算由卷积而来,卷积输出尺寸计算公式如下:

padding为valid时,y = (x - w + 1) / s,x是输入的尺寸;

padding为same时,y = x / s,不考虑卷积核尺寸了。

以上公式除不尽就向上取整。

反卷积时,y是输入,x是输出,那么就是解一个不等式

y - 1 < (x - w + 1) / s <= y,求出来一个x的取值区间,输出的x则为区间端点向下取整的中值。

验证

为了方便,依旧把输入张量设置为x,尺寸为64 * 7 * 7 * 256

x = tf.ones(shape=[64, 7, 7, 256])

先测试padding为same时的三种情况:卷积核边长=5,步长=3、卷积核边长=5,步长=2、卷积核边长=4,步长=2。它们的输出分别如下所示

 

卷积核边长=5,步长=3:输出尺寸为7 * 3 = 21

卷积核边长=5,步长=2:输出尺寸为7 * 2 = 14

卷积核边长=4,步长=2:输出尺寸为7 * 2 = 14

可见,padding为same时,反卷积输出尺寸 = 输入尺寸 * 卷积步长

再测试padding为valid时的情况,卷积核边长和步长两个变量依旧取上面的三种情况,输出分别如下所示

输出尺寸要满足关系6 < (y - 卷积核边长 + 1) / 步长 <= 7,带入具体数值,可以算出输出尺寸的值域,然后取值域端点向下取整的中间值,作为输出尺寸。

卷积核边长=5,步长=3:y的值域为(22, 25],取了中间值23

卷积核边长=5,步长=2:y的值域为(16, 18],取了中间值17

卷积核边长=4,步长=2::y的值域为(15, 17],取了中间值16

  相关解决方案