Tensorflow 中conv2d_transpose函数output_shape参数的由来和范围

目录

1.卷积和转置卷积

(1)卷积

(2)转置卷积

2.tf.nn.conv2d函数和tf.nn.conv2d_transpose函数

(1)tf.nn.conv2d函数

(2)tf.nn.conv2d_transpose函数

3.转置卷积output_shape参数的探讨

(1)卷积过程中,存在尺度丢失现象。

(2)转置卷积是恢复卷积之前原始信息的过程


1.卷积和转置卷积

(1)卷积

        卷积是卷积核在矩阵中不断移动并提取原始矩阵深度特征的一个过程。在卷积运算的过程中,为了防止被卷积图像的尺度变化,tensorflow提供了两种卷积模式:‘VALID’和‘SAME’模式。

        在‘VALID’模式下,卷积核只会在被卷积图像内部移动,卷积前后图像大小发生改变。

        在‘SAME’模式下,卷积核在被填充0的图像内部移动,卷积前后图像大小不变。

        两种情况下卷积后图像的尺寸分别满足:

H_{out}=(H_{in}-k+2p)/s+1

(2)转置卷积

        卷积对应的是图像尺度缩小的过程,而转置卷积则是试图将图像尺寸恢复到原来的尺度。下图给出了一个3×3的卷积核在一个2×3的输入矩阵上进行转置卷积的运算过程。在转置卷积的过程中,过滤器首先和输入矩阵对应元素相乘,得到的结果矩阵相互之间会有步长s的偏移量,所有对应位置元素相加后消去外围2p行,列元素即为输出矩阵。

        这里转置卷积后反推输入矩阵的尺度为:

H_{in}=(H_{out}-1)s+k-2p

        卷积是在已知输入图像尺寸Hin,卷积核大小k,步长s和填充系数p的情况下得到输出图像尺寸Hout的过程,转置卷积是根据已知输出矩阵的尺寸Hout,卷积核大小k,步长s和填充系数p的情况下反推输入图像尺寸Hin的过程。可以看出两个尺度推导是互逆的。

2.tf.nn.conv2d函数和tf.nn.conv2d_transpose函数

(1)tf.nn.conv2d函数

 tf.nn.conv2d (input,filter_weight,strides,padding=’SAME’)

 其中:

shape(input)=[batch,in_height,in_width,in_channels]:输入的四维节点矩阵,第一个参数为图片的数量,第二个参数表示图像高度,第三个参数表示图像宽度,第四个参数表示图像的通道数。

shape(filter_weight)=[filter_size,filter_size,in_channels,out_channels]:前两个参数表示过滤器的尺寸,第三个参数表示输入图像的通道数,第四个参数表示过滤器的深度。

strides=[batch,in_height,in_width,in_channel]:第一个参数表示移动的样本数。第二个参数表示移动的高度,第三个参数表示移动的宽度,第四个样本数表示移动的通道数。其中第一个参数和第四个参数必须为1,即只能在一个样本的一个通道数的特征图上进行移动。

padding=’SAME’’VALID’:当为’SAME’时,采用全0填充,此时输出尺寸满足out=⌈in/stride⌉。当为’VALID’时,不采用全0填充,此时输出尺寸满足out=⌈in-filter+1/stride⌉ 。

(2)tf.nn.conv2d_transpose函数

tf.nn.conv2d_transpose(input,filter_weight,output_shape,strides,padding=’SAME’)

其中:

shape(input)=[batch,in_height,in_width,in_channels]:输入的四维节点矩阵,第一个参数为图片的数量,第二个参数表示图像高度,第三个参数表示图像宽度,第四个参数表示图像的通道数。

shape(filter_weight)=[filter_size,filter_size,out_channels,in_channels]:前两个参数表示过滤器的尺寸,第三个参数表示输出的通道数,第四个参数表示输入的通道数。

output_shape=[batch,out_height,out_width,out_channels]:确定输出矩阵的尺寸,由于在卷积过程中存在向上取整的过程,因此当步长大于1时,同一个矩阵反卷积可能会得到多个结果,需要这个参数指定输出的具体尺寸。其中这里的out_channels要和过滤器中的保持一致。

strides=[batch,in_height,in_width,in_channel]:第一个参数表示移动的样本数。第二个参数表示移动的高度,第三个参数表示移动的宽度,第四个样本数表示移动的通道数。其中第一个参数和第四个参数必须为1,即只能在一个样本的一个通道数的特征图上进行移动。

padding=’SAME’’VALID’:两种不同的填充方式。

3.转置卷积output_shape参数的探讨

        可以看出,与卷积函数相比,转置卷积额外多出了一个output_shape参数,但是我们从前面的理论上分析,两个过程的输出矩阵的尺寸都是确定的,为什么要在转置卷积函数过程中额外指定呢?核心思想有两点:

①卷积过程中,存在尺度丢失现象。

        上述两个过程推导中,所有的元素都被有效利用,然而当卷积核步长大于1时,往往并不是如此。如下图所示,分别展示了在‘SAME’模式和‘VALID’模式下,卷积核步长stride=2时两种尺度信息丢失现象。对于‘SAME’模式的全0填充,我们可以把它理解为填充0的行、列数量恰好等于所需的数量,也可以理解成所填充0为最大数量2p=k-1,而一些填充0从未被卷积核遍历过,这里为了便于解释,我们采用后面一种理解方法。

        可以看出对于两种模式,其最右下边一圈数据从未被感知过,因此我们在得到输出矩阵时并不能得知输入矩阵是否有最外围的数据,即存在尺度信息丢失的过程,公式推导中所给出的是被有效利用元素的尺度大小。一般情况下针对两种填充模式,有以下关系成立:

        SAME’ 情况下不同尺度矩阵填充到相同尺度,实际尺度≤计算尺度

        ‘VALID’情况下卷积核未达到边界就停止运算,计算尺度≤实际尺度

        在任意一种填充模式下,一个输入矩阵恰好被卷积核遍历到尺度丢失最大化之间共有stride-1个尺度范围。前面所给公式均是全部元素被有效遍历的情况。

②转置卷积是恢复卷积之前原始信息的过程

        由于在卷积过程中存在尺度信息丢失的现象,因此我们在转置卷积的过程中需要指定丢失的尺度信息。

        对于同一个输入矩阵,其对应着stride-1种输出矩阵,需要用output_shape指定输出维度,其维度范围为:

[(H_{in}-1)s+k-2p,H_{in}\cdot s+k-2p-1]

        padding=‘SAME, 2p = k -1 ,故维度范围为:

[(H_{in}-1)s+1,H_{in}\cdot s]

        当padding=‘VALID, 2p = 0 ,故维度范围为:

[(H_{in}-1)s+k,H_{in}\cdot s+k-1]

        综上,可以得到两个经典结论:

        ①当我们需要通过转置卷积实现成倍上采样时,应当选用padding=’SAME’方式,步长即为采样放大倍数。

        ②对于同一个输入矩阵,采用不同填充模式,可以指定的输出矩阵大小范围是不同的。在指定同一个output_shape的情况下,存在一种算法可以得到输出矩阵,而另一种算法报错的情况。当卷积核大小k和移动步长s满足k>s的关系时,输出维度范围完全不同。

(上述所有结论均已在编译器得到验证)

  • 36
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值