普通卷积、转置卷积、膨胀卷积详细介绍以及用法

本文详细介绍了普通卷积、转置卷积和膨胀卷积的基本概念、用法,以及在PyTorch中的实现,特别强调了转置卷积的上采样功能和膨胀卷积在语义分割中的作用,同时提到了GriddingEffect问题及其解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通卷积、转置卷积、膨胀卷积详细介绍以及用法

1、普通卷积操作

首先回顾下普通卷积,下图以stride=1,padding=0,kernel_size=3为例,假设输入特征图大小是4x4的(假设输入输出都是单通道),通过卷积后得到的特征图大小为2x2。一般使用卷积的情况中,要么特征图变小(stride > 1),要么保持不变(stride = 1),当然也可以通过四周padding让特征图变大但没有意义

在这里插入图片描述
pytorch中的Tensor通道排列顺序是:[batch, channel, height, width]
卷积(Conv2d)在pytorch中对应的函数是:

torch.nn.Conv2d(in_channels, 
                out_channels, 
                kernel_size, 
                stride=1, 
                padding=0, 
                dilation=1, 
                groups=1, 
                bias=True, 
                padding_mode='zeros')

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

import torch.nn as nn
import torch
 
 
im = torch.randn(1, 1, 5, 5)
c = nn.Conv2d(1, 1, kernel_size=2, stride=2, padding=1)
output = c(im)
 
print(im)
print(output)
print(list(c.parameters()))

通过计算我们知道输出矩阵尺寸应该为N =(5 - 2 + 2*1)/ 2 +1 = 3.5,但实际的打印信息如下:
在这里插入图片描述

2、转置卷积

转置卷积(Transposed Convolution) 在语义分割或者对抗神经网络(GAN)中比较常见,其主要作用就是做上采样(UpSampling)。在有些地方转置卷积又被称作fract

### 卷积与反卷积之间的关系 为了理解如何从部分卷积结果通过反卷积操作来推导原始卷积核,需要先了解两者之间存在的数学联系以及各自的尺寸变化规律。 #### 正向卷积过程中的尺寸变换 正向卷积过程中,给定输入特征图 \( H \times W \),卷积核大小为 \( K \times K \),步长为 \( S \),填充量为 \( P \),则输出特征图的尺寸可以通过下述公式计算得出: \[ O = \frac{H + 2P - K}{S} + 1 \] 其中 \( O \) 表示输出特征图的高度或宽度[^1]。 #### 反卷积转置卷积)的过程及其尺寸变换 当执行反卷积时,目标是从较小的特征映射恢复到较大的空间维度。此时使用的公式如下所示: \[ out = (in - 1) \times s + k' - 2p \] 这里需要注意的是,在某些情况下,\( k' \) 并不等于原来的卷积核大小 \( k \),而是经过调整后的有效卷积核大小,特别是当涉及到膨胀卷积的时候。对于标准的非膨胀卷积而言,可以直接使用原卷积核大小作为参数参与上述公式的运算[^2]。 #### 计算卷积核的方法探讨 要基于已知的部分卷积结果逆推出卷积核本身是一个复杂的问题,因为这通常涉及到了解线性方程组甚至更复杂的优化问题。然而,如果假设条件允许简化处理——即只考虑单通道灰度图像、无偏移项且忽略激活函数的影响,则可以尝试构建一个简单的模型来进行近似估计。 具体来说,设有一个已知的小区域内的卷积结果矩阵 \( C_{result} \),其对应的输入数据子集记作 \( X \),那么理论上存在某个未知的卷积核 \( K \),使得: \[ C_{result} = conv(X, K) \] 这里的 `conv` 函数代表了具体的卷积操作实现方式。由于卷积本质上是一种局部加权平均的操作形式,因此可以根据这个特性设置一系列约束条件并利用数值方法求得可能满足这些条件下的最优解之一作为所求的卷积核。 但是值得注意的是,这种方法得到的结果往往不是唯一的,并且实际应用中还需要考虑到多通道彩色图像的情况以及其他因素如边界效应等带来的影响。 ```python import numpy as np from scipy.signal import correlate2d def estimate_kernel(input_patch, output_patch): """ 尝试估算用于生成output_patch的一个简单版本的卷积核。 参数: input_patch: ndarray, 形状为(h,w), 输入的数据片段 output_patch: ndarray, 形状为(H,W), 已知的卷积结果 返回: estimated_kernel: ndarray, 形状接近于input_patch.shape 的卷积核估计值 """ # 假设卷积核大小不超过输入补丁的一半边长 max_k_size = min(output_patch.shape)//2 + 1 best_match_error = float('inf') best_estimated_kernel = None for h in range(1,max_k_size+1): for w in range(1,max_k_size+1): kernel_shape = (h,w) # 初始化随机权重作为初始猜测 init_weights = np.random.randn(*kernel_shape) # 使用互相关代替卷积以匹配scipy库的行为 predicted_output = correlate2d(input_patch,init_weights,'valid') error = ((predicted_output-output_patch)**2).mean() if error < best_match_error: best_match_error = error best_estimated_kernel = init_weights return best_estimated_kernel # 示例调用 if __name__ == "__main__": # 创建模拟测试案例 true_kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]]) test_input = np.ones((7,7)) expected_result = correlate2d(test_input,true_kernel,'valid') recovered_kernel = estimate_kernel(test_input[:5,:5],expected_result[:3,:3]) print("Estimated Kernel:\n",recovered_kernel) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值