转置卷积最全博客链接 (最下面)
这一份足够了!!!因为连我这个学渣都看懂了
deconv / transposed conv
转置卷积又叫反卷积、逆卷积。不过转置卷积是目前最为正规和主流的名称,因为这个名称更加贴切的描述了卷积的计算过程,而其他的名字容易造成误导。在主流的深度学习框架中,如TensorFlow,Pytorch,Keras中的函数名都是conv_transpose。
一开始困惑的地方:
- 因为叫做转置卷积,但把卷积核转置(或者左右翻转上下翻转),卷积后输出还是越来越小(或不变,至少不会增大)
为什么人们很喜欢叫转置卷积为反卷积或逆卷积。首先举一个例子,将一个4x4的输入通过3x3的卷积核在进行普通卷积(无padding, stride=1),将得到一个2x2的输出。而转置卷积将一个2x2的输入通过同样3x3大小的卷积核将得到一个4x4的输出,看起来似乎是普通卷积的逆过程。就好像是加法的逆过程是减法,乘法的逆过程是除法一样,人们自然而然的认为这两个操作似乎是一个可逆的过程。但事实上两者并没有什么关系,操作的过程也不是可逆的。
普通的卷积操作大家应该都知道,kernel在输入上不断滑动,每次进行互相关运算即可。
但是实际在计算机中计算的时候,并不是像这样一个位置一个位置的进行滑动计算,这样效率太低。计算机会将卷积核转换成等效的矩阵,将输入转换为向量。通过输入向量和卷积核矩阵的相乘获得输出向量。输出的向量经过整形便可得到我们的二维输出特征。balabalabalabala…
其余内容先看第一个博客链接就行。
我简单看了下示意图,发现问题并不简单:
- 卷积
- 反卷积
So,转置不是指单纯的将卷积核 w 变为 wT
如果将卷积计算写成矩阵乘法(在程序中,为了提高卷积操作的效率,就可以这么干,比如tensorflow中就是这种实现),Y=cX(其中 Y表示将 Y拉成一维向量, X 同理),那么反卷积确实可以表示为 cT Y,而这样的矩阵乘法,恰恰等于 w 左右翻转再上下翻转后与补0的 Y 卷积的情况。
参考的高质量博文:
1. https://blog.csdn.net/tsyccnh/article/details/87357447 (推荐先看这个,很详细)
2. https://www.zhihu.com/question/43609045?sort=created (用矩阵乘法实现卷积运算的详细推导)
3. https://zhuanlan.zhihu.com/p/48501100
4. https://blog.csdn.net/susansmile1014/article/details/77676259 (含卷积、转置卷积常用公式总结)
5. https://blog.csdn.net/silence2015/article/details/78649734
6. https://iksinc.online/tag/transposed-convolution/