反卷积(Transposed Convolution),又称转置卷积、反向卷积,在深度学习中主要用于上采样(upsampling),常见于**生成对抗网络(GANs)、语义分割(Semantic Segmentation)、超分辨率重建(Super-Resolution)**等任务。
误解:
反卷积不是普通卷积的数学逆操作,而是一种特定的卷积运算,其主要目的是增大特征图的尺寸。
反卷积的意义是卷积之后的矩阵的每个元素有一个感受视野,反卷积希望通过这个元素还原感受视野里面的内容。并且由于卷积后的元素的感受视野有相交的情况,所以反卷积中也出现了结果中有些元素的值来源于卷积结果的一个或多个元素的现象,理论上通过反卷积,我们可以通过将特征图反卷积还原到原图大小从而获取到我们的卷积核在原图中提取的是什么信息。
在**普通卷积(Convolution)**中,输入大小 N × N N \times N N×N 经过一个 K × K K \times K K×K 的卷积核(stride 为 S S S,不使用 padding)后,输出尺寸会缩小:
O = N − K S + 1 O = \frac{N - K}{S} + 1 O=SN−K+1
这意味着,卷积操作丢失了空间信息,导致特征图尺寸缩小。在某些任务(如图像生成、语义分割)中,我们需要恢复更大尺寸的输出,因此需要使用反卷积来进行上采样。
假设输入是 3 × 3 3 \times 3 3×3 的矩阵,使用 2 × 2 2 \times 2 2×2 的卷积核,步长(stride)为 1,无填充(padding)。
输入矩阵:
[ 1 2 3 4 5 6 7 8 9 ] \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} 147258369
卷积核:
[ 1 0 0 − 1 ] \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} [100−1]
进行标准卷积运算后,输出尺寸变小( 2 × 2 2 \times 2 2×2):
[ ( 1 × 1 + 2 × 0 + 4 × 0 + 5 × ( − 1 ) ) ( 2 × 1 + 3 × 0 + 5 × 0 + 6 × ( − 1 ) ) ( 4 × 1 + 5 × 0 + 7 × 0 + 8 × ( − 1 ) ) ( 5 × 1 + 6 × 0 + 8 × 0 + 9 × ( − 1 ) ) ] \begin{bmatrix} (1 \times 1 + 2 \times 0 + 4 \times 0 + 5 \times (-1)) & (2 \times 1 + 3 \times 0 + 5 \times 0 + 6 \times (-1)) \\ (4 \times 1 + 5 \times 0 + 7 \times 0 + 8 \times (-1)) & (5 \times 1 + 6 \times 0 + 8 \times 0 + 9 \times (-1)) \end{bmatrix} [(1×1+2×0+4×0+5×(−1))(4×1+5×0+7×0+8×(−1))(2×1+3×0+5×0+6×(−1))(5×1+6×0+8×0+9×(−1))]
[ − 4 − 4 − 4 − 4 ] \begin{bmatrix} -4 & -4 \\ -4 & -4 \end{bmatrix} [−4−4−4−4]
输出尺寸 2 × 2 2 \times 2 2×2,比输入 3 × 3 3 \times 3 3×3 小。
反卷积的目标是增大尺寸,假设使用相同的 2 × 2 2 \times 2 2×2 卷积核,对 2 × 2 2 \times 2 2×2 的输入进行反卷积,目标是恢复成 3 × 3 3 \times 3 3×3 尺寸。
假设 2 × 2 2 \times 2 2×2 输入:
[ 1 2 3 4 ] \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} [1324]
经过反卷积后:
[ 1 0 2 0 0 0 3 0 4 ] \begin{bmatrix} 1 & 0 & 2 \\ 0 & 0 & 0 \\ 3 & 0 & 4 \end{bmatrix} 103000204
然后再用相同的卷积核滑动求和,最终恢复到 3 × 3 3 \times 3 3×3 大小。
方法 | 作用 | 是否可学习 |
---|---|---|
上采样(最近邻插值、双线性插值) | 仅放大尺寸,不增加特征 | 否 |
反卷积(Transposed Convolution) | 放大尺寸并提取特征 | 是 |
在 PyTorch 里,使用 ConvTranspose2d
实现反卷积:
import torch
import torch.nn as nn
# 定义一个反卷积层
deconv = nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=3, stride=2, padding=1, output_padding=1)
# 创建输入特征图 (1,1,4,4)
x = torch.randn(1, 1, 4, 4)
# 进行反卷积
output = deconv(x)
print(output.shape) # 输出尺寸增大
DCGAN
(深度卷积生成对抗网络)中,G 生成器利用反卷积将噪声映射到高分辨率图像。FCN(全卷积网络)
中,用反卷积恢复图像尺寸,使分类结果与原图对齐。反卷积可能导致非均匀的像素分布,出现类似棋盘的伪影。解决方案: