卷积(Convolution)与转置卷积(Convolution Transposed)

本文深入探讨了转置卷积的概念,解释了它如何不同于卷积的反向传播,但又与其有着相似之处。通过矩阵表示,展示了卷积和转置卷积的过程,以及如何在GAN中应用转置卷积来恢复图像大小。
要注意转置卷积有点类似卷积的反向传播,并不是等价于反向传播。因为转置卷积只是恢复了原图的size而没有恢复其值。

卷积

在这里插入图片描述在这里插入图片描述

如下上图所示输入是5∗55*555的,卷积核是3∗33*333,然后pading是0,stride是1。卷积过程如第二幅图所示。根据计算公式(W−F+2P)/S+1(W-F+2P)/S+1(WF+2P)/S+1,有(5−3+2∗0)/1+1(5-3+2*0)/1+1(53+20)/1+1可以看到卷积之后结果是3∗33*333的feature map。
下面我们使用矩阵来表示这个过程,我们首先将image矩阵和feature map矩阵写成列向量形式:

[1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,1]T\begin{bmatrix} 1 , 1, 1, 0,0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0 ,1 ,1, 0, 0 ,1 \end{bmatrix}^T[1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,0,1]T

输入的size是(26,1)表示为X,多出来的1是用于bias计算用的。

[4,3,4,2,4,3,2,3,4]T \begin{bmatrix} 4, 3,4, 2, 4, 3, 2, 3, 4 \end{bmatrix}^T [4,3,4,2,4,3,2,3,4]T

feature map的size是(9,1)表示为Y
由于我们通过公式(W−F+2P)/S+1(W-F+2P)/S+1(WF+2P)/S+1,已经知道输出Feature map的size为(9,1),所以我们将卷积核展开成size为(9,26)的稀疏矩阵:

[101000100010100000000000000101000100010100000000000000101000100010100000000000000001010001000101000000000000001010001000101000000000000001010001000101000000000000000010100010001010000000000000010100010001010000000000000010100010001010]\begin{bmatrix} 1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 &0 & 0& 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 &0 \\ 0& 1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 &0 & 0& 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0&0& 1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 &0 & 0& 0 & 0 & 0 & 0 & 0 & 0 &0 \\ 0&0&0&0&0&1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 &0 & 0& 0 & 0 & 0 & 0 \\ 0&0&0&0&0&0&1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 &0 & 0& 0 & 0 & 0 \\ 0&0&0&0&0&0&0&1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 &0 & 0& 0 & 0\\ 0&0&0&0&0&0&0&0&0&0&1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 &0 \\ 0&0&0&0&0&0&0&0&0&0&0&1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 & 0 \\ 0&0&0&0&0&0&0&0&0&0&0&0&1 &0 &1 & 0 & 0 &0 &1 & 0 &0 &0 &1 &0 &1 & 0 \end{bmatrix}100000000010000000101000000010000000001000000000100000100010000010101000001010000000001000100000100010100010101010101010001010001000001000100000000010100000101010000010001000001000000000100000000010000000101000000010000000001000000000

可以看见卷积核展成稀疏矩阵是有明显规律的。这个稀疏矩阵称为C。因此卷积的过程就可以表示为:

CX=YCX=YCX=Y

可以知道维度(9,26)的矩阵与维度为(26,1)的矩阵点乘得到维度为(9,1)的feature map。 那么对于转置卷积来说,其操作目的就是要使feature map还原到其原来的图像的size。所以用Y点乘C的转置刚好就回到图像的size:

CTY=XC^TY=XCTY=X

也就是维度(26,9)与维度(9,1)点乘结果刚好为(26,1),再去掉偏置项,就回到原图size。转置卷积的过程就是这样,只不过,只是还原其size,没有还原其值。这个在Gan中常用到,这是因为Gan需要把图还原到真实的size。
为甚说有点类似卷积的反向传播,这是因为卷积网络反向传播时,梯度会从feature map这边映射会原图,所以有点类似于反向传播,但是不等同。

这里我们使用Pytorch来举个栗子:

我们有一张图片是size为(280,280)的png,灰度图像,通道数为1,转为矩阵后size为(1,280,280)。我们先对其进行卷积,然后在进行转置卷积,看看效果:
import torch
from PIL import Image
import torch.nn as nn
import numpy as np

pic=Image.open('test1.png')
pic_array=np.asarray(pic)
print('pic_array.shape:',pic_array.shape)
pic_array_re=pic_array.reshape(1,1,280,280)
print('pic_array.shape_re:',pic_array_re.shape)
pic_tensor=torch.Tensor(pic_array_re)
print('pic_tensor.shape:',pic_tensor.shape)
Cov=nn.Conv2d(1,1,4,1,0) #(inchannels,out_channels,kernel_size,stride,padding)
pic_cov=Cov(pic_tensor)
print('pic_cov.shape:',pic_cov.shape)


Cov_tran=nn.ConvTranspose2d(1,1,4,1,0)
pic_cov_tran=Cov_tran(pic_cov)
print('pic_cov_tran.shape:',pic_cov_tran.shape)

输出结果为:
pic_array.shape: (280, 280)
pic_array.shape_re: (1, 1, 280, 280)
pic_tensor.shape: torch.Size([1, 1, 280, 280])
pic_cov.shape: torch.Size([1, 1, 277, 277])
pic_cov_tran.shape: torch.Size([1, 1, 280, 280])

可以看见转置卷积就是一个图像size还原的过程,你就把它当成一个图像放大的卷积过程就行了,但是要注意转置卷积要想恢复原来的size,其参数设置要与卷积过程对应。那么怎么确定转置卷积后的结果的size呢?
我们可以知道在 nn.ConvTranspose2d(1,1,4,1,0)中,第一个参数表示输入的通道数,第二个参数是输出的通道数,第三个参数是与此转置卷积对应的卷积操作中使用的卷积核size,第四个参数是与此转置卷积对应的卷积操作中使用的stride,第四个参数是与此转置卷积对应的卷积操作中使用的padding,设此转置卷积对应的卷积操作得到的feature map的size是M∗MM*MMM,也就是此转置卷积的输入的size为M∗MM*MMM,根据公式(W−F+2P)/S+1=M(W-F+2P)/S+1=M(WF+2P)/S+1=M,我们有W=S(M−1)+F−2PW=S(M-1)+F-2PW=S(M1)+F2P这样我们就得到了转置卷积后图像的size,也就是原始图像的size。比如在上例中,W=1∗(277−1)+4−2∗0=280W=1*(277-1)+4-2*0=280W=1(2771)+420=280
### 转置卷积用于上采样的原理 转置卷积(也被称为反卷积或分数步长卷积)是一种常用于神经网络中的操作,特别是在生成模型和语义分割任务中。其主要目的是增加特征图的空间维度,即执行上采样。 在传统卷积过程中,输入被滤波器扫描并压缩成更小的表示形式;而在转置卷积中,则是从较小尺寸的地图重建更大尺度的信息[^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、付费专栏及课程。

余额充值