一、转置卷积Deconv
反卷积是对特征图进行上采样的一种手段。在代码实现中实际上是将feature map转为列向量,将原始的卷积(降采样)矩阵扩充并转置计算,故而称为转置卷积
二、等价于对原始的特征图进行一些变换,再对得到的新的特征图进行卷积操作
假设反卷积函数给定的参数:
原始特征图宽度:HHH
反卷积操作给定的卷积核大小kernel_size=kkernel\_size=kkernel_size=k,步长stride=sstride=sstride=s
反卷积操作给定的paddiing=ppaddiing=ppaddiing=p
反卷积等价于对于一个原始特征图变换得到的新的特征图进行卷积操作
1.插值得到新的特征图
新的特征图宽度:H′=H+(s−1)×(H−1)H'=H+(s-1)×(H-1)H′=H+(s−1)×(H−1)
解释:新的特征图是由原始特征图插值(interpolation)得到
插值方式:在原始特征图相邻的两个列(行)之间插入全0列(行)填充,插入的列(行)数为Stride−1Stride-1Stride−1
原始特征图有HHH个行(列),即有H−1H-1H−1个位置,在每个位置插入是s−1s-1s−1个0列(行),得到新的特征图宽度:H′=H+(s−1)×(H−1)H'=H+(s-1)×(H-1)H′=H+(s−1)×(H−1)
2.等价卷积中的padding操作:
在对新的特征图进行卷积前,需要根据设定的padding值对新的特征图进行padding,在这个等价卷积操作中,padding操作也进行了变换:
设定的反卷积padding=ppadding=ppadding=p在新的特征图上变为padding′=k−p−1padding'=k-p-1padding′=k−p−1
3.等价卷积操作
这样反卷积操作就等价于在上面插值并填充后得到的新的特征图上进行一个新的卷积操作
其中新的卷积操作对应卷积核大小不变,kernel_size′=kernel_size=kkernel\_size'=kernel\_size=kkernel_size′=kernel_size=k,卷积步长恒为111,stride′=1stride'=1stride′=1(步长的影响已在新的padding填充中起作用了)
利用卷积核与新的特征图进行卷积操作,得到输出宽度:Hout=[H+(s−1)×(H−1)+2×(k−p−1)−k1]+1=s×(H−1)−2×p+kH_{out}=[\frac{H+(s-1)×(H-1)+2×(k-p-1)-k}{1}]+1=s×(H-1)-2×p+kHout=[1H+(s−1)×(H−1)+2×(k−p−1)−k]+1=s×(H−1)−2×p+k
三、反卷积争议问题
使用前提:stride>1stride > 1stride>1
补充:same卷积操作
是通过padding使得卷积之后输出的特征图大小保持不变(相对于输入特征图),不代表得到的输出特征图的大小与输入特征图的大小完全相同,而是他们之间的比例保持为
输入特征图大小/输出特征图大小 = stride
举例:
输入特征图为6×6,stride=2, kernel_size = 3, 所以进行same卷积操作得输出特征图为3×3 (6/2 = 3)
如果输入特征图为5×5,stride=2,kernel_size = 3,这时候设置padding = 1,那么也会得到输出特征图为3×3
那么这样的情况就会导致在逆卷积时出现一个问题。
问题:
不同大小的图片经过卷积运算能得到相同尺寸的输出,那么作为逆运算,同样的一张输入图像经过反卷积是否会有不同尺寸的合法输出?
上面还只是进行same卷积的情况,如果考虑valid卷积,stride=2, kernel_size = 3,padding=0时,输入特征图为7×7和8×8的结果也是3×3
实现办法:
解决争议的办法就是使用output_padding参数
output_padding的作用是:
当stride > 1时,Conv2d将多个输入形状映射到相同的输出形状。output_padding通过在一边有效地增加计算出的输出形状来解决这种模糊性。
首先我们要认同一个前提:
大多数情况下我们都希望经过卷积/反卷积处理后的图像尺寸比例与步长相等,即输入特征图大小/输出特征图大小 = stride,也就是same模式。
所以我们只要通过添加output_padding这一参数来使得结果满足这一前提,那么输出的图片的大小就能够保证为:输入图片*stride的大小,而不是任意可能的大小
引入output_padding后,第二节末式子变为Hout=(Hin−1)×s−2×p+k+output_paddingH_{out}=(H_{in}-1)×s-2×p+k+output\_paddingHout=(Hin−1)×s−2×p+k+output_padding 有Hout=(Hin−1)∗s[0]−2∗p[0]+k[0]+output_padding[0]Wout=(Win−1)∗s[1]−2∗p[1]+k[1]+output_padding[1]H_{out}=(H_{in}-1)*s[0]-2*p[0]+k[0]+output\_padding[0] \\ W_{out}=(W_{in}-1)*s[1]-2*p[1]+k[1]+output\_padding[1] Hout=(Hin−1)∗s[0]−2∗p[0]+k[0]+output_padding[0]Wout=(Win−1)∗s[1]−2∗p[1]+k[1]+output_padding[1] same模式下,参数padding(注意与output_padding区别)一般建议设置为p=(k−1)/2p=(k-1)/2p=(k−1)/2.当我们希望得到输入特征图大小/输出特征图大小 = stride的话,代入上面的式子能够得到结果:
output_padding=s−1output\_padding=s - 1output_padding=s−1这样就能够满足输入特征图大小/输出特征图大小 = stride
当然,你可以取别的值,这并不会影响到逆卷积的计算,但是在后面进行有关大小的操作时就很可能出现问题,因为输出的图片的大小并不能保证是 输入图片*stride的大小,可能是任意正确的大小,如上面举的例子,可能是7×7或8×8等
1万+

被折叠的 条评论
为什么被折叠?



