背景
今天研究了下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