机器学习: 深度学习中的卷积和反卷积

卷积神经网络(CNN)几乎成了目前 CV 领域的主流模型,从最初的常规的 2D 卷积形式发展到现在,研究人员已经提出了各种各样的卷积形式,比如 3D 卷积,depth-wise 卷积, point-wise 卷积,扩张(Atrous)卷积,deconvolution 等等,这些卷积在 CNN 模型中,发挥着不同的作用。 今天,我们将介绍 CNN 中,各种不同的卷积形式。

在图像处理中,卷积最常见的形式是滤波,我们常说的高斯滤波,导向滤波,双边滤波,其实都是一种卷积形式:

I o ( i , j ) = m = k k n = k k I i n ( i + m , j + n ) F ( m , n ) I_o (i, j) = \sum_{m=-k}^{k} \sum_{n = -k}^{k} I_{in} (i +m, j+n) \mathcal{F}(m, n)

I i n I_{in} 是输入图像, F \mathcal{F} 是一个滤波器, 简单来说,滤波器就类似一个模板,模板与输入图像对应的元素相乘,然后再相加,就是一个卷积运算,如果从信号分析的角度来看,这种运算形式,严格来说应该是一种 相关运算。不过,在图像处理领域,大家都习惯称之为卷积。

所以说,卷积运算,其实就是简单的乘法和加法,再加上一个模板,或者叫滤波器,或者叫滑动窗口。

从上面的表达式,我们可以看出,卷积运算,其实也可以转换成矩阵的乘法,我们知道,矩阵和列向量相乘,得到的依然是列向量,比如:

A x = b \mathbf{A} \mathbf{x} = \mathbf{b}

如果,我们把输入图像拉成一个一维列向量,输出图像同样拉成一个一维列向量,那么我们可以得到:

A I i n = I o \mathbf{A} \mathbf{I}_{in} = \mathbf{I}_{o}

这种情况下,矩阵 A \mathbf{A} 可以看成是由卷积模板构成的一个稀疏矩阵,如下图所示:

在这里插入图片描述
我们把input 拉成一个列向量,output 也拉成一个列向量,而滤波器可以构成一个稀疏矩阵,这种稀疏矩阵,只在某些对应的位置上有值,其他位置上都是 0 ,利用矩阵乘法,就可以得到相应的输出。

卷积运算一般会让输出变得比输入更小,比如上面的图示,一个 4 × 4 4 \times 4 的输入和 3 × 3 3 \times 3 的 kernel 做卷积,最终会得到一个 2 × 2 2 \times 2 的输出。如果写成矩阵形式,就是:

A 4 × 16 I i n 16 × 1 = I o 4 × 1 \mathbf{A}^{4 \times 16} \mathbf{I}_{in}^{16 \times 1} = \mathbf{I}_{o}^{4 \times 1}

那么,如果我们想让输出变得比输入更大,可以对矩阵 A \mathbf{A} 进行转置:

A T ( 16 × 1 ) I o 4 × 1 = I i n 16 × 1 \mathbf{A}^{T(16 \times 1)} \mathbf{I}_{o}^{4 \times 1} = \mathbf{I}_{in}^{16 \times 1}

这种运算就对应于下图所示的卷积形式:

在这里插入图片描述

这个就是我们在 CNN 中提到的 deconvolution,其实严格来说,应该称之为 转置卷积(Transposed Convolution),如果将其写成卷积形式,我们可以看到,其实是对 input 做了 padding,使得 input 变成 了 6 × 6 6 \times 6 ,然后再用 3 × 3 3 \times 3 的kernel 去做卷积,最后可以得到 4 × 4 4 \times 4 的输出。

所以说,convolution 让输出变小,而 deconvolution 让输出变大,其实这些都是矩阵的运算。

https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215