最近在研究FSRCNN(Fast Super-Resolution Convolutional Neural Networks)论文的时候,看见其中的网络结构用上了反卷积deconvolution,因此,为了搞明白这个操作,博主也查阅了一些资料,下面是一些个人的理解,如有不妥之处欢迎大家在评论区斧正
1.关于卷积操作的一些细节
要理解反卷积,首先我们得明白卷积里面的一些细节
比如一个input,维度是4x4,卷积核大小为3x3,那么,根据公式:
⌊sn+2p−f+1⌋
可知,输出图像的尺寸为2x2,下面我们举一个例子:
input:⎣⎢⎢⎡1214247538511623⎦⎥⎥⎤卷积核:[131215142]
那么,卷积操作就可以表示为:
⎣⎢⎢⎡1214247538511623⎦⎥⎥⎤∗⎣⎡131215142⎦⎤=[96798979]
(其中,我们令padding=0,步长为1)
这种卷积操作使得输入值和输出值之间存在有位置上的连接关系,即原图像某一位置的一些值会影响输出图像对应的位置的值。同时,卷积核相当于桥梁作用,将原图像中的9个值和输出图像的1个值建立起连接关系,换句话说,卷积操作就是多对一的映射关系
2.反卷积的直观理解
那么,反卷积相当于卷积的逆过程,举个例子:即可以用一个2x2大小的图像,通过反卷积输出一个4x4大小的图片,其中我们要特别注意的是这个操作保持的是1对9的关系
3.关于卷积矩阵
如果我们将input矩阵看成一个16x1的矩阵呢?它就会变成下面的样子:
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1231248617524513⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤(1)
我们想找到卷积的另一种矩阵表示方法,因此,我们尝试对卷积核这样构造:
⎣⎢⎢⎡1000210012000100301013214112040110305113254102040010005100250002⎦⎥⎥⎤(2)
那么,(1)矩阵的维度是16x1,(2)矩阵的维度是4x16,我们惊喜地发现:如果将(2)与(1)相乘,刚好完成卷积的操作,得到一个4x1的矩阵(这个矩阵经过微调就能得到我们之前的2x2矩阵)
因此,矩阵(2)就被称为卷积矩阵
4.反卷积:利用转置卷积矩阵
我们发现:在利用卷积矩阵的卷积操作中,4x16维度的矩阵乘16x1矩阵可以得到4x1矩阵
现在我们想从4x1矩阵得到16x1矩阵,应该怎么做呢?
我们惊喜地发现:16x4维度的矩阵乘4x1维度的矩阵刚好可以得到16x1的矩阵
因此,我们对刚刚的卷积矩阵进行转置,得到:
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1210314015200000012103140152000000001210314015200000012103140152⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤(3)
那么,举个例子:对于某一个输入矩阵:
[2113]
我们的卷积核为:
⎣⎡131215142⎦⎤
下面我们要做的就是将卷积核变成转置卷积矩阵的形式,input变成4x1列向量的形式,然后进行矩阵相乘:
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1210314015200000012103140152000000001210314015200000012103140152⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤∗⎣⎢⎢⎡2113⎦⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡2541710167521161418176⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
最后,这个16x1的向量经过微调就变成了:
⎣⎢⎢⎡2751510218416161717146⎦⎥⎥⎤
这样,我们就完成了反卷积的过程啦
转载:
https://blog.csdn.net/weixin_44586473/article/details/101831063