转置卷积(逆卷积)A guide to convolution arithmetic for deep learning 阅读笔记

首先 , 转置卷积有时被称为逆卷积 但这是不准确的,因为这个过程不是数学的逆运算 不推荐使用转置卷积的说法

input->卷积->转置卷积->output
input 与output并不同
有时被称为逆卷积 是因为 output与input有相同的shape
然后keep in mind that 对于转置卷积 都有一个与其等价的普通卷积的形式 不过要在输入上做一些变化

众所周知 一般卷积操作会使图片shape越来越小 而转置卷积可以用来增大shape 故一般用于上采样

众所周知 卷积操作可以看作矩阵相乘
转置卷积(逆卷积)A guide to convolution arithmetic for deep learning 阅读笔记_第1张图片转置卷积(逆卷积)A guide to convolution arithmetic for deep learning 阅读笔记_第2张图片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#图片来自: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...

如图:
转置卷积(逆卷积)A guide to convolution arithmetic for deep learning 阅读笔记_第3张图片
也就是说 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
转置卷积(逆卷积)A guide to convolution arithmetic for deep learning 阅读笔记_第4张图片图为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

如果有错误请指正

你可能感兴趣的:(深度学习)