转置卷积(Transposed Convolution)—— 上采样
核心思想每个输入像素铺开成一个核普通卷积是多个输入像素合并成1个输出像素。转置卷积反过来1个输入像素生成多个输出像素。具体例子设定输入2×2 的特征图卷积核2×2为了简单实际常用 3×3步长 stride 2输入: 卷积核: ┌───┬───┐ ┌───┬───┐ │ a │ b │ │ w │ x │ ├───┼───┤ ├───┼───┤ │ c │ d │ │ y │ z │ └───┴───┘ └───┴───┘转置卷积的铺砖过程核心操作每个输入像素 × 整个卷积核然后按 stride 间隔铺到输出图上。第一步输入像素 a 铺开a 位于左上角在输出图的 (0,0) 位置铺一个 2×2 的块列0 列1 列2 列3 ┌─────┬─────┬─────┬─────┐ 行0 │ a·w │ a·x │ │ │ ├─────┼─────┼─────┼─────┤ 行1 │ a·y │ a·z │ │ │ ├─────┼─────┼─────┼─────┤ 行2 │ │ │ │ │ ├─────┼─────┼─────┼─────┤ 行3 │ │ │ │ │ └─────┴─────┴─────┴─────┘第二步输入像素 b 铺开b 在输入的右边所以向右移动 stride2 格在 (0,2) 位置铺列0 列1 列2 列3 ┌─────┬─────┬─────┬─────┐ 行0 │ a·w │ a·x │ b·w │ b·x │ ├─────┼─────┼─────┼─────┤ 行1 │ a·y │ a·z │ b·y │ b·z │ ├─────┼─────┼─────┼─────┤ 行2 │ │ │ │ │ ├─────┼─────┼─────┼─────┤ 行3 │ │ │ │ │ └─────┴─────┴─────┴─────┘第三步输入像素 c 铺开c 在输入的下边向下移动 stride2 格在 (2,0) 位置铺列0 列1 列2 列3 ┌─────┬─────┬─────┬─────┐ 行0 │ a·w │ a·x │ b·w │ b·x │ ├─────┼─────┼─────┼─────┤ 行1 │ a·y │ a·z │ b·y │ b·z │ ├─────┼─────┼─────┼─────┤ 行2 │ c·w │ c·x │ │ │ ├─────┼─────┼─────┼─────┤ 行3 │ c·y │ c·z │ │ │ └─────┴─────┴─────┴─────┘第四步输入像素 d 铺开d 在右下角向右下各移 2 格在 (2,2) 位置铺列0 列1 列2 列3 ┌───────┬───────┬───────┬───────┐ 行0 │ a·w │ a·x │ b·w │ b·x │ ├───────┼───────┼───────┼───────┤ 行1 │ a·y │ a·z │ b·y │ b·z │ ├───────┼───────┼───────┼───────┤ 行2 │ c·w │ c·x │ d·w │ d·x │ ├───────┼───────┼───────┼───────┤ 行3 │ c·y │ c·z │ d·y │ d·z │ └───────┴───────┴───────┴───────┘关键观察在这个例子里没有重叠因为输入 2×2核 2×2stride2每个核铺开后刚好填满 2×2 的区域四个核铺开后刚好填满 4×4互不重叠输出尺寸 输入尺寸 × stride 2 × 2 4如果核更大就会重叠假设核是 3×3输入还是 2×2stride2输入: 卷积核: ┌───┬───┐ ┌───┬───┬───┐ │ a │ b │ │w1 │w2 │w3 │ ├───┼───┤ ├───┼───┼───┤ │ c │ d │ │w4 │w5 │w6 │ └───┴───┘ ├───┼───┼───┤ │w7 │w8 │w9 │ └───┴───┴───┘a 铺开左上角列0 列1 列2 列3 列4 ┌──────┬──────┬──────┬──────┬──────┐ 行0 │a·w1 │a·w2 │a·w3 │ │ │ ├──────┼──────┼──────┼──────┼──────┤ 行1 │a·w4 │a·w5 │a·w6 │ │ │ ├──────┼──────┼──────┼──────┼──────┤ 行2 │a·w7 │a·w8 │a·w9 │ │ │ ├──────┼──────┼──────┼──────┼──────┤ 行3 │ │ │ │ │ │ ├──────┼──────┼──────┼──────┼──────┤ 行4 │ │ │ │ │ │ └──────┴──────┴──────┴──────┴──────┘b 铺开向右移 2 格┌──────┬──────┬──────┬──────┬──────┐ 行0 │a·w1 │a·w2 │a·w3b·w1│b·w2 │b·w3│ ← 列2重叠了 ├──────┼──────┼──────┼──────┼──────┤ 行1 │a·w4 │a·w5 │a·w6b·w4│b·w5 │b·w6│ ← 列2重叠了 ├──────┼──────┼──────┼──────┼──────┤ 行2 │a·w7 │a·w8 │a·w9b·w7│b·w8 │b·w9│ ← 列2重叠了 ├──────┼──────┼──────┼──────┼──────┤ ... (c 和 d 继续往下铺行2也会重叠)重叠区域 对应位置相加这就是棋盘格伪影的来源——重叠不均匀时某些位置被多加或少加。直观类比普通卷积转置卷积类比把4块小瓷砖压成1块大瓷砖把1块瓷砖敲碎成4块铺到4个位置输入→输出多个→1个合并1个→多个铺开形象理解“压缩”“膨胀”输出尺寸公式输出尺寸 (输入尺寸 - 1) × stride - 2 × padding kernel_size output_padding最常用配置让输出刚好是输入的整数倍stride2, kernel3, padding1, output_padding1 输出 (输入 - 1) × 2 1 输入 × 2 - 1... 不对 正确配置 stride2, kernel4, padding1, output_padding0 输出 (2-1)×2 - 2×1 4 2 - 2 4 4 ✓ (输入2×2 → 输出4×4)实际上 PyTorch 的ConvTranspose2d会自动计算你只需要告诉它in_channels,out_channelskernel_sizestridepadding一句话总结转置卷积 每个输入像素 × 卷积核然后按 stride 间隔铺到输出图上重叠的地方相加。它不是真正的反卷积只是一种能放大特征图的可学习上采样方法。