转置卷积 transposed convolution

1. 转置卷积

转置卷积(Transposed Convolution)也叫Fractionally-strided Convolution和Deconvolution,但用的最多的是Transposed Convolution。

注意:

  • 转置卷积不是卷积的逆运算,只会大小恢复为原本大小。
  • 转置卷积也卷积,也需要卷积核

1.1 转置卷积的作用

转置卷积的作用是进行上采样upsampling,增大图像。

2. 转置卷积的执行过程

输入为2x2的特征图,但会在周围填充0,卷积核的大小为3x3,最终得到一个4x4的特征图,这是一个上采样的过程
stride=1,padding=0
在这里插入图片描述

2.1转置卷积的运算步骤

首先一些参数的介绍:

  • stride(sss):步长
  • kernel size(kkk):卷积核大小
  • padding(ppp):填充大小

下面是运算的步骤:

  1. 首先在元素间填充 s−1s-1s1 行和列的0
  2. 然后在特征图四周填充k−p−1k-p-1kp1行和列的0
  3. 然后对卷积核进行转置,也就是上下左右翻转。注意:转置的卷积核一般是进行之前进行卷积操作(下采样)的卷积核
  4. 最后进行正常的卷积一般不进行填充,步长为1

输出的特征图的大小的计算方式如公式所示,其中索引[0][0][0]代表高度方向的数值,索引[1][1][1]代表宽度方向的数值。
在这里插入图片描述

下图是例子(忽略偏移),其中s=1,p=0,k=3。因此:元素间不填充,特征图四周填充3-0-1=2行与列
最后使用经过转置的卷积核进行卷积,步长为1。
输出特征图的高=(2-1)x1-2x0+3=4;宽=(2-1)x1-2x0+3=4
在这里插入图片描述

2.2 运算例子

s=2,p=0,k=3s=2,p=0,k=3s=2,p=0,k=3
在元素间填充2-1=1个0;然后在特征图之间填充3-0-1=2 行和列的0
输出的特征图高=(2-1)x2-2x0+3=5;宽=(2-1)x2-2x0+3=5
在这里插入图片描述
s=2,p=1,k=3s=2,p=1,k=3s=2,p=1,k=3
在元素间填充2-1=1个0;然后在特征图之间填充3-1-1=1 行和列的0
输出的特征图高=(3-1)x2-2x1+3=5;宽=(3-1)x2-2x1+3=5
在这里插入图片描述

3. 转置卷积的运行原理

要理解转置卷积的原理,首先要理解普通卷积的执行过程。下面将以一个4x4的特征图与3x3的卷积核为例进行介绍。

3.1普通卷积

这里 s=1,p=0,k=3对特征图进行卷积,得到一个2x2的特征图。
在这里插入图片描述
在之前的介绍中,普通卷积的执行过程是一个窗口在不断滑动来得到结果。
在这里插入图片描述
但在实际执行中,这种方法是低效。下面介绍另一种计算方法:
方法如图所示,

  1. 先根据输入特征图、步长、填充与卷积核得到卷积核的等效矩阵。
    这些等效矩阵可以通过类似上面的滑动窗口的方法得到,每个等效矩阵对应一次滑动窗口里的值使用卷积核的值进行替代
    在当前例子中,可以得到4个等效矩阵
  2. 针对每个等效矩阵,都与输入特征图进行运算:先进行对应位置的相乘,再将所有位置的值进行求和,得到输出特征图中的值。

在这里插入图片描述

3.2 转置卷积

上面进行普通卷积时的计算过程可以变为两个矩阵的乘法运算
首先将输入特征图展开为一行,构成矩阵III;而每个等效矩阵都展开为一列,然后拼在一起,构成矩阵CCC
在这里插入图片描述
在这里插入图片描述
然后计算I∗CI*CIC,就得到了输出特征图展开成行的矩阵OOO
在这里插入图片描述
要注意的是矩阵CCC不可逆的,因此转置卷积不是普通卷积的逆运算,只能得到一个与输入特征图同等大小的一个结果。

要得到一个与矩阵III同等大小的矩阵PPP,有两种方法:

只需让矩阵OOO右乘矩阵CCC的转置CTC^TCT即可。矩阵PPP就是将转置卷积的结果展开。
在这里插入图片描述
将矩阵OOO还原为普通卷积的输出特征图的形式。
而对于CTC^TCT,由于其最初是将等效矩阵以列方向进行展开并拼接,因此这里CTC^TCT的每行还原成矩阵
而从CTC^TCT得到的每个矩阵与输出特征图进行对应位相乘并结果相加,得到矩阵PPP的值。

在这里插入图片描述
而这个过程中出现了一个有趣的现象:

① 使用等效矩阵CTC^TCT的第一个矩阵来与矩阵OOO进行运算,其结果为0,也就是矩阵PPP的第一个值。
而图像中的右下角,对输入特征图进行填充后,如果使用绿色矩阵对输入特征图进行卷积操作的话,会得到与前面相同的结果0。
在这里插入图片描述
② 接着使用CTC^TCT的第二个矩阵进行运算,结果为2,也就是矩阵PPP的第二个值。
而绿色矩阵右移一格后再次进行运算,同样得到矩阵PPP的第二个值。
在这里插入图片描述
③ 就这样不断计算矩阵CTC^TCT的矩阵与滑动绿色矩阵,最终发现使用输入特征图III与绿色矩阵可以得到矩阵PPP
而绿色矩阵在输入特征图III上进行滑动与运算的过程,其实让绿色矩阵作为卷积核在步长为1的情况对输入特征图III进行普通卷积

而且继续观察绿色矩阵,可以发现绿色矩阵就是普通卷积中所使用的卷积核的转置
在这里插入图片描述

4. 总结

通过上面分析,就可以知道为什么通过对输入特征图进行填充使用转置的卷积核并且使用转置卷积核与输入特征图进行步长=1的普通卷积操作就可以得到结果

### 转置卷积用于上采样的原理 转置卷积(也被称为反卷积或分数步长卷积)是一种常用于神经网络中的操作,特别是在生成模型和语义分割任务中。其主要目的是增加特征图的空间维度,即执行上采样。 在传统卷积过程中,输入被滤波器扫描并压缩成更小的表示形式;而在转置卷积中,则是从较小尺寸的地图重建更大尺度的信息[^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]架构下,转置卷积也是构建生成器的重要组成部分之一,负责逐步放大噪声向量直至形成完整的合成样本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值