卷积和反卷积核计算公式

1. 卷积

输出:
o u t _ s i z e = i n _ s i z e + 2 × p a d d i n g − k e r n e l _ s i z e s t r i d e + 1 out\_size = \frac{in\_size+2\times padding - kernel\_size}{stride} + 1 out_size=stridein_size+2×paddingkernel_size+1

如果想让输入和输出大小一样,则stride必须为1,并且:
p a d d i n g = k e r n e l _ s i z e − 1 2 padding = \frac{kernel\_size-1}{2} padding=2kernel_size1
因此kernel应该为奇数。
比较常用的组合为: kernel_size=3, padding=1, stride=1kernel_size=5, padding=2, stride=1

如果想让输出为输入的一半,则: stride=2
p a d d i n g = k e r n e l − 1 2 padding= \frac{kernel-1}{2} padding=2kernel1
常用组合为:stride=2, kernel=3, padding=1。注意如果出现除不尽的情况,则一律向下取整。

对于pooling,计算和conv一样。不过pooling没有padding,因此:
o u t _ s i z e = i n _ s i z e − k e r n e l s t r i d e + 1 out\_size = \frac{in\_size-kernel}{stride}+1 out_size=stridein_sizekernel+1

2. 反卷积

转置卷积的计算公式为:
o u t _ s i z e = s t r i d e × ( i n _ s i z e − 1 ) + k e r n e l out\_size = stride\times (in\_size-1)+kernel out_size=stride×(in_size1)+kernel
转置卷积中的padding作用于卷积正好相反,是将最外层的去掉一圈,所以带有padding的反卷积输出为:

o u t _ s i z e = s t r i d e × ( i n _ s i z e − 1 ) × + k e r n e l − 2 × p a d d i n g out\_size = stride\times (in\_size-1)\times + kernel - 2\times padding out_size=stride×(in_size1)×+kernel2×padding

如果要像conv那样在外围加0的话,pytorch中可以使用output_padding参数。

实现2倍上采样,需要: stride=2, kernel_size=2*padding+2

常用组合为:stride=2, kernel=2, padding=0stride=2, kernel_size=4, padding=1, 这样能实现2倍上采样:
o u t _ s i z e = 2 ⋅ ( i n _ s i z e − 1 ) + 2 − 2 ⋅ 0 = 2 ⋅ i n _ s i z e \begin{aligned} out\_size &= 2\cdot (in\_size-1)+2-2\cdot 0 \\ &= 2\cdot in\_size \end{aligned} out_size=2(in_size1)+220=2in_size

3. 卷积中的dilation

dilation又称为 atrous convolutions,即在卷积核的相邻元素之间增加spacing。dilation_rate由参数d控制,通常添加d-1个空格进入kernel中。d=1时表示普通的卷积操作。

dilated conv可以在不增加卷积核大小的情况下增大感受野,同时不增加额外开销,在多个扩张卷积逐次堆叠的情况下尤其有效。

dilated conv有效卷积核大小为:
k ^ = k + ( k − 1 ) ( d − 1 ) \hat k = k + (k − 1)(d − 1) k^=k+(k1)(d1)
因此dilated conv的输出大小为:

o s i z e = i n s i z e + 2 ⋅ p a d d i n g − k ^ s t r i d e + 1 = i n s i z e + 2 ⋅ p a d d i n g − k − ( k + 1 ) ⋅ ( d − 1 ) s t r i d e + 1 \begin{aligned} o_size =& \frac{in_{size} + 2\cdot padding - \hat k}{stride} + 1 \\ =& \frac{in_{size} + 2\cdot padding - k - (k+1)\cdot (d-1)}{stride} + 1 \end{aligned} osize==strideinsize+2paddingk^+1strideinsize+2paddingk(k+1)(d1)+1

举例如下:
在这里插入图片描述

### 关于卷积计算公式的解析 #### 基本概念与定义 在深度学习领域,特别是在卷积神经网络(CNNs)中,卷积操作是心组件之一。卷积作为这一过程中不可或缺的部分,在图像处理其他数据密集型应用中有重要作用[^1]。 #### 普通卷积尺寸的影响因素 对于标准的卷积层而言,其输出特征图大小可以通过下面这个公式来估算: \[ \text{Output Size} = \frac{\text{Input Size} + 2P - K}{S} + 1 \] 其中 \(K\) 表示卷积宽度/高度;\(P\) 是填充量(padding),即输入边界外增加零的数量;而 \(S\) 则代表步幅(stride)[^5]。 #### 膨胀卷积及其特性 当涉及到膨胀卷积(也称为空洞卷积)时,情况变得稍微复杂一些。这种类型的卷积允许在网络内部创建更大的感受野而不必显著增加参数数量或降低分辨率。具体来说,膨胀率(dilation rate, 或者叫膨胀系数)用于控制相邻权重之间的间隔距离。因此,膨胀后的卷积的实际有效尺寸可以按照如下方式进行调整: \[ \text{Dilated Kernel Size} = (\text{Original Kernel Size}-1)\times\text{Dilation Rate}+1 \][^2] 这意味着即使保持相同的物理尺寸不变的情况下,通过改变膨胀因子也可以有效地增大模型的感受范围。 #### 输出特征图的变化规律 值得注意的是,随着膨胀程度加大,虽然能够捕捉到更广泛的信息区域,但是可能会造成某些位置上的信息被跳过采样,尤其是在靠近边界的像素点上更为明显。这可能会影响最终提取出来的特征质量[^4]。 ```python def calculate_dilated_kernel_size(original_kernel_size, dilation_rate): """ Calculate the size of a dilated convolution kernel. Args: original_kernel_size (int): Original non-dilated kernel size. dilation_rate (int): Dilation factor applied to the kernel. Returns: int: The effective size after applying dilation. """ return (original_kernel_size - 1) * dilation_rate + 1 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值