转置卷积(Transposed convolution)(反卷积)在不同情况下的计算

反卷积即卷积的逆运算,下面针对不同的卷积列出其对应的反卷积大小计算

ps: 卷积输出 o = (i+2*p-k)/s +1
以下都是,输入、卷积核都是 n * n为例

一、没有Padding,步长为1的卷积的反卷积

k,p=0,s=1的卷积
对应
反卷积:k’ = k,s’ = s,p’ = k-1 的卷积
其输出大小:o’ = i’ + (k-1)

例如:

输入为4 * 4,k=33,s=1,padding=0,输出为22的卷积,
其对应反卷积为:
2 * 2 经过padding’=2(得到66),k’=33,s’=1的卷积计算,得 4*4

ps:算一次卷积,输入输出知道了,倒过来就是反卷积输入输出。
如想知道k=3,s=1的反卷积的输出,那它去做卷积运算,但后输入输出倒过来就是反卷积的输入输出。

二、有0填充,步长为1的卷积的反卷积

零填充卷积的转置等同于卷积用较少零填充的输入。

k,s=1,p的卷积
对应
k’ = k,s’ = s,p’ = k-p-1的反卷积
输出:o = i’ + (k-1) -2p

例如:

输入5 * 5、k = 4 * 4,s = 1 , padding = 2 的卷积
对应反卷积
输入6 * 6,k = 4,s = 1,padding=1

三、same padding(half padding)

对于same padding(ps : same padding输入输出相等),其卷积的转置就是本身
k = 2*n + 1,s=1,p = 向下取整(k/2),其输入=输出
对应反卷积
k’ = k,s’ = s,p’ = p
完全一样

四、Full padding

完全填充卷积的转置的等效是非填充卷积

k,s = 1,p=k-1的卷积
对应反卷积
k,s=1,p=0
输出 o = i - (k-1)

例如:

五、无填充,步长>1

卷积s>1,那么估计反卷积s<1
input矩阵元素间填充0,来达到s<1的效果

假设卷积是非填充的(p=0),并且其输入大小i使得i-k是s的倍数。在这种情况下,以下关系成立:
卷积 输入i*i, k, p=0, s, (i-k)是s的整数倍
对应反卷积:
k’ = k,s’ = 1,p’ = k - 1, i"(i"是输入矩阵元素间每个填充s-1个的0)
输出:o = s(i’-1)+k (此处的i’ 非i")

例如:

卷积输入 55,k=3,s=2,p=0
对应反卷积:
输入2
2,k=3,s=1,p=2

有填充,步长>1

当卷积的输入大小i使得i+2p-k是s的倍数时,通过组合关系(有填充,s=1)和关系(无填充,s>1),分析可以扩展到零填充情况:

卷积:k, s, p, i,(i+2p-k 是 s 的整数倍)
对应反卷积
i"(输入元素间填充s-1个0),k‘ = k,s’ = 1,p’ = k -p -1
输出 o = s(i’-1) +k -2p

例如


卷积输入:55,k=33,padding=1,s = 2
对应反卷积
输入33,k’ = 33,s‘ = 1,padding‘ = 1

引入变量a可以统一下前面的规律:
卷积:k, s, p
对应反卷积
i’‘(是输入i’的元素间填充s-1个0),k’ = k,s’ = 1,p’ = k -p -1,a = (i + 2p - k) ,a是对上面、右边的填充。
输出: o = s(i’-1) + a +k - 2p

例如:

卷积输入66 ,k = 33,padding = 1,s = 22 (此时i+2p-k 不是 s 的整数倍)
对应反卷积
输入为3
3,k’ = 3*3,s’ = 1,p’ = 1, a = 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]架构下,转置卷积也是构建生成器的重要组成部分之一,负责逐步放大噪声向量直至形成完整的合成样本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值