首先 , 转置卷积有时被称为逆卷积 但这是不准确的,因为这个过程不是数学的逆运算 不推荐使用转置卷积的说法
input->卷积->转置卷积->output
input 与output并不同
有时被称为逆卷积 是因为 output与input有相同的shape
然后keep in mind that 对于转置卷积 都有一个与其等价的普通卷积的形式 不过要在输入上做一些变化
众所周知 一般卷积操作会使图片shape越来越小 而转置卷积可以用来增大shape 故一般用于上采样
众所周知 卷积操作可以看作矩阵相乘
44的input经过33的卷积核得到2*2的output
可以看作一个(1,16)@(16,4)=(1,4)
那么反过来 把 (1,4)来乘以(16,4)transpose =(1,16)就变回了原来的大小
#图片来自:https://blog.csdn.net/tsyccnh/article/details/87357447,侵删
从这个角度理解起来似乎比较简单…但还是不知道具体怎么操作(
首先 转置卷积可以看作把卷积的output作一些变化之后的 卷积
如果想增大卷积操作的输出shape 比较自然地 会想到zero padding
但是单纯的增加padding,虽然保证了输出shape增大 但是却没有考虑数据之间的关系 (比如p如果大于卷积核 就必然出现边缘一个0,这显然不是想要的)
https://arxiv.org/abs/1603.07285文中作者是这么解释的
考虑一个 (4,4) 的input 经过(3,3)的卷积 (步长为1 padding为0)
i = 4, k = 3, s = 1 and p = 0
output: (2,2)
这个很好想象 图就无了
注意到 input 左上角的元素只影响了output左上角的元素
那么在转置卷积中 我们通过补0操作 让output '(也就是转置卷积的输出)只受
input '(这里也就是转置卷积的输入,普通卷积的输出)的左上角的元素影响
为了维持这种关系
#Im not sure if I get the essence...
如图:
也就是说 zero_padding’=2(p’=2)
比较容易的 得到一个关系式子
p’ = k − 1
o '= i '+(k-1)
对于步长仍为1 但有zero_padding的卷积 的转置卷积的等价卷积
它只需要更少的zero_padding ’
p’=k-p-1
o '=i '+(k-1)-2p
#关于这些式子的推出步骤 一会考虑步长后一并给出 这个例子就是s=1时的特例
但对于步长不为1的卷积操作的转置卷积呢(s>1)
应该有个与该转置卷积对应的步长(s<1)的卷积…
做法是output(卷积的输出 为网络中转置卷积的输入)的每列每行间插入0
注意 与转置卷积等价的卷积 步长总为1,如图
s=2的话 output间插(2-1) 个0
s=s 插(s-1)个0
图为s=2的情况 插入了1个0
#注意 这个例子中包含了一个zero_padding' (p'=1)
也就是
i’=o+(o-1)*(i-1)
而
o=(i-k+2p)/s+1
o’=(i’-k+2p’)/1 +1
i=o’
其中i为卷积操作input的边长 (正方形)
i‘是o经过插0后得到的结果 shape
o是卷积得到的结果 在神经网络中 这一般是转置卷积的输入 但不是文中的i’
文中的i’是与该转置卷积等价的卷积操作中经过插值之后的结果 留意数学式比较好理解
解出
p’=k-p-1
o’=i’+k-2p-1
计算
o’=(o+(s-1)(o-1)+2*(k-p-1)-k)/1 +1
# i' p'
化简得
o’=(o-1)*s-2p+k
对应pytorch文档
Hin换成o就一样了(
我觉得 为什么要这么插0 补0 是为了维持某种关系 而其结果上 表现如此
说法有点乱 建议看下论文但我觉得论文里说的也挺乱的 :
https://arxiv.org/abs/1603.07285
参考的还有:
https://blog.csdn.net/qq_27261889/article/details/86304061
https://blog.csdn.net/tsyccnh/article/details/87357447
如果有错误请指正