小言_互联网的博客

卷积神经网络(3)——关于反卷积的理解(step by step)

367人阅读  评论(0)

最近在研究FSRCNN(Fast Super-Resolution Convolutional Neural Networks)论文的时候,看见其中的网络结构用上了反卷积deconvolution,因此,为了搞明白这个操作,博主也查阅了一些资料,下面是一些个人的理解,如有不妥之处欢迎大家在评论区斧正

1.关于卷积操作的一些细节

要理解反卷积,首先我们得明白卷积里面的一些细节
比如一个input,维度是4x4,卷积核大小为3x3,那么,根据公式: n + 2 p f s + 1 \lfloor \frac{n+2p - f }{s} + 1 \rfloor
可知,输出图像的尺寸为2x2,下面我们举一个例子: i n p u t : [ 1 2 3 1 2 4 8 6 1 7 5 2 4 5 1 3 ] : [ 1 2 1 3 1 4 1 5 2 ] input:\begin{bmatrix} 1&2&3&1\\2&4&8&6\\1&7&5&2\\4&5&1&3\end{bmatrix}\\ \footnotesize卷积核:\quad\begin{bmatrix}1&2&1\\3&1&4\\1&5&2\end{bmatrix}
那么,卷积操作就可以表示为: [ 1 2 3 1 2 4 8 6 1 7 5 2 4 5 1 3 ] [ 1 2 1 3 1 4 1 5 2 ] = [ 96 89 79 79 ] \begin{bmatrix} 1&2&3&1\\2&4&8&6\\1&7&5&2\\4&5&1&3\end{bmatrix}*\begin{bmatrix}1&2&1\\3&1&4\\1&5&2\end{bmatrix} = \begin{bmatrix}96&89\\79&79\end{bmatrix}
(其中,我们令padding=0,步长为1
使 \color{OrangeRed}{\footnotesize这种卷积操作使得输入值和输出值之间存在有位置上的连接关系} ,即原图像某一位置的一些值会影响输出图像对应的位置的值。同时,卷积核相当于桥梁作用,将原图像中的9个值和输出图像的1个值建立起连接关系,换句话说,卷积操作就是多对一的映射关系

2.反卷积的直观理解

那么,反卷积相当于卷积的逆过程,举个例子:即可以用一个2x2大小的图像,通过反卷积输出一个4x4大小的图片,其中我们要特别注意的是这个操作保持的是1对9的关系

3.关于卷积矩阵

如果我们将input矩阵看成一个16x1的矩阵呢?它就会变成下面的样子: [ 1 2 3 1 2 4 8 6 1 7 5 2 4 5 1 3 ] (1) \begin{bmatrix}1\\2\\3\\1\\2\\4\\8\\6\\1\\7\\5\\2\\4\\5\\1\\3\\\end{bmatrix}\tag{1}
我们想找到卷积的另一种矩阵表示方法,因此,我们尝试对卷积核这样构造: [ 1 2 1 0 3 1 4 0 1 5 2 0 0 0 0 0 0 1 2 1 0 3 1 4 0 1 5 2 0 0 0 0 0 0 0 0 1 2 1 0 3 1 4 0 1 5 2 0 0 0 0 0 0 1 2 1 0 3 1 4 0 1 5 2 ] (2) \begin{bmatrix}1&2&1&0&3&1&4&0&1&5&2&0&0&0&0&0\\0&1&2&1&0&3&1&4&0&1&5&2&0&0&0&0\\0&0&0&0&1&2&1&0&3&1&4&0&1&5&2&0\\0&0&0&0&0&1&2&1&0&3&1&4&0&1&5&2\end{bmatrix}\tag{2}
那么,(1)矩阵的维度是16x1,(2)矩阵的维度是4x16,我们惊喜地发现:如果将(2)与(1)相乘,刚好完成卷积的操作,得到一个4x1的矩阵(这个矩阵经过微调就能得到我们之前的2x2矩阵)

因此,矩阵(2)就被称为卷积矩阵

4.反卷积:利用转置卷积矩阵

我们发现:在利用卷积矩阵的卷积操作中,4x16维度的矩阵乘16x1矩阵可以得到4x1矩阵

现在我们想从4x1矩阵得到16x1矩阵,应该怎么做呢?
我们惊喜地发现:16x4维度的矩阵乘4x1维度的矩阵刚好可以得到16x1的矩阵

因此,我们对刚刚的卷积矩阵进行转置,得到: [ 1 0 0 0 2 1 0 0 1 2 0 0 0 1 0 0 3 0 1 0 1 3 2 1 4 1 1 2 0 4 0 1 1 0 3 0 5 1 1 3 2 5 4 1 0 2 0 4 0 0 1 0 0 0 5 1 0 0 2 5 0 0 0 2 ] (3) \begin{bmatrix}1&0&0&0\\2&1&0&0\\1&2&0&0\\0&1&0&0\\3&0&1&0\\1&3&2&1\\4&1&1&2\\0&4&0&1\\1&0&3&0\\5&1&1&3\\2&5&4&1\\0&2&0&4\\0&0&1&0\\0&0&5&1\\0&0&2&5\\0&0&0&2\end{bmatrix}\tag{3}

那么,举个例子:对于某一个输入矩阵: [ 2 1 1 3 ] \begin{bmatrix}2&1\\1&3\end{bmatrix}
我们的卷积核为: [ 1 2 1 3 1 4 1 5 2 ] \begin{bmatrix}1&2&1\\3&1&4\\1&5&2\end{bmatrix}

下面我们要做的就是将卷积核变成转置卷积矩阵的形式,input变成4x1列向量的形式,然后进行矩阵相乘: [ 1 0 0 0 2 1 0 0 1 2 0 0 0 1 0 0 3 0 1 0 1 3 2 1 4 1 1 2 0 4 0 1 1 0 3 0 5 1 1 3 2 5 4 1 0 2 0 4 0 0 1 0 0 0 5 1 0 0 2 5 0 0 0 2 ] [ 2 1 1 3 ] = [ 2 5 4 1 7 10 16 7 5 21 16 14 1 8 17 6 ] \begin{bmatrix}1&0&0&0\\2&1&0&0\\1&2&0&0\\0&1&0&0\\3&0&1&0\\1&3&2&1\\4&1&1&2\\0&4&0&1\\1&0&3&0\\5&1&1&3\\2&5&4&1\\0&2&0&4\\0&0&1&0\\0&0&5&1\\0&0&2&5\\0&0&0&2\end{bmatrix}*\begin{bmatrix}2\\1\\1\\3\end{bmatrix} =\begin{bmatrix}2\\5\\4\\1\\7\\10\\16\\7\\5\\21\\16\\14\\1\\8\\17\\6\end{bmatrix}
最后,这个16x1的向量经过微调就变成了: [ 2 5 4 1 7 10 16 7 5 21 16 14 1 8 17 6 ] \begin{bmatrix}2&5&4&1\\7&10&16&7\\5&21&16&14\\1&8&17&6\end{bmatrix}

这样,我们就完成了反卷积的过程啦


转载:https://blog.csdn.net/weixin_44586473/article/details/101831063
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场