卷积计算公式_深度学习中卷积计算(coarse)指南

本文介绍了卷积神经网络中卷积计算的基础知识,包括输入输出特征图尺寸的计算公式,卷积核参数量的确定,卷积操作的矩阵表示,以及感受野的计算方法。还特别讨论了空洞卷积的输入输出尺寸计算,并引用了相关深度学习资源。

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

  • 前言

卷积的计算是CNN中最基本的算术单元,卷积的计算过程中出现的:Input Feature Map(FP), Output Feature Map(FP), 以及与 Kernel(size, strides, padding, dilation rate等)之间的关系和计算方式是我们应该掌握的基本知识。笔者在这里对其进行简要介绍。

  • 卷积Input FP size 与 Output FP size之间的计算公式

1、如图1所示, 其展示了从Input FP 经过卷积计算得到 Output FP的过程,每个通道相互之间独立;

621a6f408b3ec897ab04584dbbad8349.png                                             图 1:卷积计算示意图

2、假设Input FP的channels数为n_in, Output FP的channels数为n_out为例,kernel为方形,大小为k, Input FP的Padding为p, 卷积计算的步长(stride)为s。则输入输出的关系如下:fd4a844f956503d9ac6be4585bf14ec0.png

3、如图2计算示意图;由于卷积计算采用权值共享,输出的FP的每个channel是由输入FP经过n_in个卷积后采用elementwise add叠加得到一个Output FP channel,一个channel卷积的参数量为n_in * k * k,Output FP channel有n_out个channel, 所以整个卷积核参数量为:n_in * k * k * n_out.

                                    a3c0931a6a7f2776ee1601379eaf4be7.png 

        图 2:Input FP(Channel: 2), Output FP(Channel: 3), Kerenl(Size: 3x3)

  • 卷积计算方法(Convolution as a matrix operation)

以3*3卷积核K对4*4的特征图(FP)I做计算为例,将输入FP按从左到右,从上往下展开成一个16-d的向量I_vector,那么对应的3*3的卷积核应该展开如下C(4 * 16):

6a6e4b1476fc2811057e23ffcfed51f6.png

然后C * I_vector ==> O_vector(1*4); 最后对O_vector处理成2*2,得到输出FP。

  • 感受野计算(Receptive Field Arithmetic)

两层之间的感受野是指下层的FP中某一点对应上一层的size, 也就是kernel的大小。但是这里要讨论的是,某一层FP中像素对应与原始输入图像的感受野(RF)的大小如何计算?

这里笔者先直接给出计算公式,然后解释下公式中参数的定义,同时读者自己需要手推揣摩这种计算方式。

                                  ed678fa420e4c8d3d3e39f9a29fb33b8.png

1、公式第一行中的参数定义与上述一样;

2、第二行中的j_in表示当前层的Jump, 这个参数与stride相关,其表示截至到目前层的总stride,该j直接影响第三行中r的计算;

3、第三行中r表示当前层FP中的某一个点对应的感受野的大小。

  • 空洞卷积(Dilated Conv)输入与输出尺寸计算公式

dilate_rate为d, kernel的尺寸为k的卷积核的有效尺寸为:K = k + (k-1)*(d-1)

则有:输出o与输入i尺寸之间计算                                     721f1398d2b5a06f7d04bc8622308de7.png   

参考

1、A guide to convolution arithmetic for deep learning.

2、A guide to receptive field arithmetic for Convolutional Neural Networks.

### 多通道 CNN 卷积计算公式及其数学推导 在卷积神经网络(CNN)中,多通道输入数据通常用于处理图像或其他具有多个特征维度的数据。例如,在RGB彩色图像中,每个像素有三个颜色通道:红色、绿色和蓝色。为了有效地提取这些多维数据中的空间特征,卷积操作被扩展到支持多通道输入。 #### 1. 基本概念 对于单通道输入,卷积核是一个二维矩阵,它与输入数据进行滑动窗口操作并执行逐元素相乘再求和的操作[^1]。然而,在多通道情况下,卷积核不仅需要覆盖输入的空间维度(高度和宽度),还需要覆盖所有的输入通道数。因此,一个多通道卷积核实际上是由多个二维卷积核组成的三维张量,其中每个二维卷积核对应于输入的一个特定通道。 #### 2. 多通道卷积的定义 假设输入数据 \( X \in \mathbb{R}^{H_{\text{in}} \times W_{\text{in}} \times C_{\text{in}}} \),表示输入的高度 (\( H_{\text{in}} \))、宽度 (\( W_{\text{in}} \)) 和通道数 (\( C_{\text{in}} \))卷积核 \( K \in \mathbb{R}^{C_{\text{out}} \times k_h \times k_w \times C_{\text{in}}} \),其中 \( C_{\text{out}} \) 是输出通道的数量,\( k_h \) 和 \( k_w \) 分别是卷积核的高度和宽度。 对于每一个输出通道 \( c' \) (\( c' = 0, ..., C_{\text{out}}-1 \)),对应的卷积核为 \( K_{c'} \in \mathbb{R}^{k_h \times k_w \times C_{\text{in}}} \)。该卷积核会作用在整个输入上,并通过如下公式计算: \[ Z[h', w', c'] = b[c'] + \sum_{h=0}^{k_h-1}\sum_{w=0}^{k_w-1}\sum_{c=0}^{C_{\text{in}}-1} X[h+h', w+w', c] \cdot K_{c'}[h, w, c], \] 这里: - \( h' \), \( w' \) 表示输出位置, - \( b[c'] \) 是偏置项, - \( X[h+h', w+w', c] \) 是输入数据的一部分, - \( K_{c'}[h, w, c] \)卷积核的部分权重。 上述公式可以理解为:对于每一对输入通道和卷积核通道,先做标准的二维卷积运算;然后将所有通道的结果加总起来得到最终的响应值[^2]。 #### 3. 输出尺寸计算 如果给定步幅 (stride) \( s \) 和填充大小 (padding) \( p \),则输出的高度和宽度可以通过下面的公式得出: \[ H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2p - k_h}{s} \right\rfloor + 1, \] \[ W_{\text{out}} = \left\lfloor \frac{W_{\text{in}} + 2p - k_w}{s} \right\rfloor + 1. \] 这一步骤考虑到了如何调整输入数据以适应不同的卷积参数设置。 #### 4. 实现代码示例 以下是基于 Python 的简单实现片段展示如何手动完成一次多通道卷积过程: ```python import numpy as np def convolve_multi_channel(input_data, kernel, bias=None, stride=1, padding=0): batch_size, input_height, input_width, num_input_channels = input_data.shape output_channels, filter_height, filter_width, _ = kernel.shape padded_input = np.pad( input_data, ((0, 0), (padding, padding), (padding, padding), (0, 0)), mode='constant' ) output_height = int((input_height + 2 * padding - filter_height) / stride + 1) output_width = int((input_width + 2 * padding - filter_width) / stride + 1) result = np.zeros((batch_size, output_height, output_width, output_channels)) for out_c in range(output_channels): current_kernel = kernel[out_c] for i in range(output_height): for j in range(output_width): patch_start_i = i * stride patch_end_i = patch_start_i + filter_height patch_start_j = j * stride patch_end_j = patch_start_j + filter_width patches = padded_input[:, patch_start_i:patch_end_i, patch_start_j:patch_end_j, :] result[:, i, j, out_c] += np.sum(patches * current_kernel, axis=(1, 2, 3)) if bias is not None: result[..., out_c] += bias[out_c] return result ``` 此函数接受四维数组作为输入 (`batch`, `height`, `width`, `channels`) 并返回经过卷积后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值