卷积神经网络CNN之RGB三通道图像卷积计算

本文深入解析了CNN中的卷积层工作原理,重点介绍了局部连接特性及卷积计算过程,通过实例演示了卷积核与步幅对特征提取的影响。

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

  CNN里面最重要的构建单元就是卷积层。神经元在第一个卷积层不是连接输入图片的每一个像素,只是连接它们的感受野的像素,以此类推,第二个卷积层的每一个神经元仅连接位于第一个卷积层的一个小方块的神经元,即局部连接。CNN里的卷积层对输入进行特征抽取、归纳、整理,这也是CNN比只有全连接层FC的DNN准确率要高的一个原因。
  下面举个小栗子解释一下卷积如何手动计算的!

三通道卷积计算

  首先注意两点:卷积核大小以及步幅。本例中步幅为2,两个卷积核皆为3 * 3 * 3(三行三列三通道)。输入为三通道图像,经过两个卷积操作得到两个特征图。

三通道卷积计算
三通道卷积计算

  以上为两个手写计算得到的两个值。说白了就是wx+b的计算。注意步幅!

### 多通道 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`) 并返回经过卷积后的结果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值