下面的图片都是抄的,侵删
普通的卷积网络层通常会减少下采样输入图像的空间维度(高和宽)。而在空间维度被卷积神经网络层缩小后,我们可以使用另一种类型的卷积神经网络层,它可以增加上采样中间层特征图的空间维度。转置卷积就是这样的一种用于逆转下采样导致的空间尺寸减小的卷积网络层。普通的卷积不会增大输入的高宽,通常要么不变要么减半;而转置卷积则可以用来增大输入的高宽。
1. 卷积与矩阵变换的联系
卷积运算可以看作滑动窗口,卷积核不断在输入图像上滑动得到特征图对应位置的元素。但实际上计算机并不是这样计算的(因为需要单独做很多次矩阵运算,降低了运行效率),而是将卷积核重写为包含大量0的稀疏权重矩阵,然后与同样重写过的输入图像(一个行向量)进行一次矩阵运算得到输出(也是一个行向量),然后再对输出进行变换得到特征图。输入图像转行向量就是把输入的二维张量的每一行依次首位相接。
具体可以参考:javascript:void(0)
2. 基本操作
不妨设输入的大小为\(n_h\times nw\),卷积核的大小为\(k_h\times k_w\)对于stride = 1, padding = 0的情况,得到的结果为\((n_h + k_h - 1)\times (n_w + k_w - 1)\)。这很容易理解,因为形式上可以当作普通的卷积运算的逆过程。当然要注意的是卷积运算过程并不可逆,对于同一个卷积核,一个特征图经过转置卷积操作之后并不能恢复为原来的输入图像,保留的只有原始的形状。因此实际上转置卷积被称作反卷积是不恰当的,因为这和卷积并不是互逆运算。
举个栗子:
可以看到input中的阴影部分的核张量元素与\(2\times 2\)的卷积核运算得到\(2\times 2\)的张量,放在了输出的左上角。如果对Output做stride = 1, padding = 0的卷积运算(卷积核和上面相同),得到的也是\(2\times 2\)的张量,但这个张量显然和input不同。
3. 填充、步幅和多通道
与常规卷积不同,在转置卷积中,填充被应用于输出。这个意思是说假设对一个\(2\times 2\)的输入做padding = 1的转置卷积,我们先进行正常的反卷积运算,然后对得到的结果进行”删除padding“。比如输入为\(2\times 2\), kernel_size = (2, 2), padding = 1,首先按照基本操作中所说得到了\(3\times 3\)的输出,然后对结果进行“删除padding”指的是删除第一行和最后一行以及第一列和最后一列(因为这里padding = 1,相当于删除了一圈),得到的结果为\(1\times 1\)的张量。这里可以这么理解:假设给定一个输入图片,对其进行padding = x的卷积操作得到一个特征图,再对特征图进行padding = x的反卷积操作才能得到和输入图片大小一致的输出(相当于把一开始加的补0padding再删掉)。
在转置卷积中,步幅被指定为中间结果(输出),而不是输入。考虑基本操作(stride = 1)中,每个核张量元素与卷积核运算得到的\(2\times 2\)的张量是一步一步移动的,加上大于等于2的stride后就相当于每次跳stride步。
举个栗子:
对于多个输入和输出通道,转置卷积与常规卷积相同。假设输入有 ????????个通道,且转置卷积为每个输入通道分配了一个 ????ℎ×????????的卷积核张量。 当指定多个输出通道时,每个输出通道将有一个 ????????×????ℎ×???????? 的卷积核。
总结一下,如果输入的高宽都是\(n_{in}\),那么输出的高宽为\(n_{out} = (n_{in} - 1)\times s - 2\times padding + kernel\_size\)。