如何理解转置卷积(transposed convolution)

本文详细解析了反卷积(转置卷积)在CNN中的应用,强调其作为上采样的核心作用,不同于常规卷积的尺寸变化和卷积核转置过程。通过实例展示了如何计算和实现反卷积,以及其与常规卷积的区别。

简介

转置卷积也被称为反卷积,常被用用于CNN中的上采样操作,比如分割任务,或GAN网络中。反卷积并不是常规卷积的完全逆操作,反卷积也起不到根据输出特征以及对应的卷积核,恢复原始输出的作用,它最多的作用就是有可学习参数的上采样操作,仅此而已。
同时,反卷积操作并没有把正向卷积输出,对应的卷积核拿过来做转置使用,而是多了几个卷积核而已。
此外,即便是把正向卷积输出对应的卷积核拿过做反卷积,它也恢复不出来原来的参数,恢复原来参数这种操作看起来并没有太大意义,因为只是想做上采样而已。
这里与常规卷积的区别主要体现在:

  • 特征图的宽高尺寸变化与常规卷积相反
  • 常规卷积核的转置

所以实际上,反卷积是先按照一定的比例差值 来扩大输入图像的尺寸,再进行正向卷积的过程。

反卷积计算

输入特征图尺寸: hi=3h_{i}=3hi=3wi=3w_{i}=3wi=3
卷积核尺寸: hk=3h_{k}=3hk=3wk=3w_{k}=3wk=3
步长:s=2s=2s=2
padding:单边 p=1p=1p=1
期望输出特征尺寸: ho=5h_{o}=5ho=5wo=5w_{o}=5wo=5
上面这些参数能完整的体现一个反卷积的过程,那么下面是具体的过程

输入特征图插值计算

对于一个输入为 hi=3h_{i}=3hi=3wi=3w_{i}=3wi=3的特征图,反卷积首先需要对输入进行插值,这就涉及到三个问题:

  • 在哪里补?
  • 补多少?
  • 补什么?

插值一般都是插入0,因为特征图的输入为尺寸为hih_{i}hiwiw_{i}wi,那么就有hi−1h_{i}-1hi1wi−1w_{i}-1wi1位置可以插入0,每个位置插入0的个数为s−1s-1s1个,插值后特征图就变成了:
hni=hi+(hi−1)(s−1)=5h_{ni}=h_{i}+(h_{i}-1)(s-1)=5hni=hi+(hi1)(s1)=5
wni=wi+(hi−1)(s−1)=5w_{ni}=w_{i}+(h_{i}-1)(s-1)=5wni=wi+(hi1)(s1)=5

正向卷积

对新的特征图做正向卷积,正向卷积的实际步长不是2,而是1,之前设置的步长是体现在插值上,反卷积的卷积步长总是为1。
此外,同样需要对输入特征做padding,两边各padding1。
那么按照常规的卷积公式:
ho=(hni+2p−hk)/1+1=5h_{o}=(h_{ni}+2p-h_{k})/1+1=5ho=(hni+2phk)/1+1=5
wo=(wni+2p−wk)/1+1=5w_{o}=(w_{ni}+2p-w_{k})/1+1=5wo=(wni+2pwk)/1+1=5
得到了想要的输出。

### 转置卷积用于上采样的原理 转置卷积(也被称为反卷积或分数步长卷积)是一种常用于神经网络中的操作,特别是在生成模型和语义分割任务中。其主要目的是增加特征图的空间维度,即执行上采样。 在传统卷积过程中,输入被滤波器扫描并压缩成更小的表示形式;而在转置卷积中,则是从较小尺寸的地图重建更大尺度的信息[^2]。具体来说: - **核大小**:定义了感受野范围内的像素数量。 - **填充**:控制边界处理方式。 - **步幅**:决定了输出相对于输入的增长比例。 这些参数共同作用于输入张量以创建更大的输出张量,在此期间引入新的空间位置,并通过学习权重矩阵来决定新值如何计算。 ### 实现方法 以下是使用PyTorch框架实现的一个简单例子,展示了如何利用`nn.ConvTranspose2d()`函数来进行二维转置卷积运算: ```python import torch from torch import nn class TransposeConvLayer(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=4, stride=2, padding=1): super(TransposeConvLayer, self).__init__() self.conv_transpose = nn.ConvTranspose2d( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, padding=padding, bias=False) def forward(self, x): return self.conv_transpose(x) # 创建一个实例对象 layer = TransposeConvLayer(in_channels=64, out_channels=32) # 假设有一个batch size为8、通道数为64、高度宽度均为16的随机输入张量 input_tensor = torch.randn((8, 64, 16, 16)) output_tensor = layer(input_tensor) print(output_tensor.shape) # 输出形状应接近(batch_size, output_channel, height*stride, width*stride) ``` 这段代码片段说明了一个基本层的设计思路以及它的工作流程——接受特定格式的数据作为输入并通过调用`.forward()`方法得到经过变换后的结果。 ### 应用场景 转置卷积广泛应用于各种计算机视觉任务之中,尤其是在那些需要恢复原始分辨率图像的任务里表现突出。例如: - **超分辨率重建**:提高低质量图片的质量,使其更加清晰锐利; - **风格迁移**:改变给定照片的艺术效果而不失真原有结构细节; - **医学影像分析**:增强MRI/CT扫描所得图像以便更好地识别病变区域; - **视频帧插值**:预测两帧之间缺失的画面从而让播放过程更为流畅自然。 此外,在对抗生成网络(DCGAN)[^5]架构下,转置卷积也是构建生成器的重要组成部分之一,负责逐步放大噪声向量直至形成完整的合成样本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值