28、卷积 - 卷积的基础公式

本文深入探讨卷积的基础公式,解析卷积神经网络中Tensor的概念和运算过程。通过介绍图片的三维表示[H, W, C],阐述卷积核的形状[CO, KH, KW, CI]及其作用,强调输入与卷积核通道一致的重要性。最后,揭示卷积运算的输出形状[1, HO, WO, CO],并提及批量处理时的公式变化。" 51566692,5597221,Android Debug模式签名步骤详解,"['Android开发', '签名', '调试']

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

本节推导一下卷积的基础公式,还是先上一张卷积运算的示意图图。

我们知道,一张图片有 3 个维度,分别是长、宽、通道。

这三个维度分别用 3 个字母代替,分别是 H(Height, 对应的是长这一维度), W(Width, 对应的是宽这一维度),C(Channel,对应的是通道这一维度)。

对于一张长宽为 224 x 224 的 RGB 图像,我们可以用以下的方法来表示这种图片的“数据形状”,[H, W, C] = [224, 224, 3]。

这里的 [H, W, C] 是一个3维数组,区别于我们常见的一维数组(也叫向量)和二维数组(也叫矩阵),3 维或更高维的数组,我们称之为张量(英文名为 Tensor)。

Tensor 这个概念很重要,在几乎所有的神经网络推理、训练框架里面,神经网络算法的输入和输出数据都会被叫作 Tensor。

整个神经网络的运行就像是 Tensor 在一层一层的算法之间流动一样,因此有个大名鼎鼎的框架叫做TensorFlow,意为 Tens

### 卷积核的数学公式卷积神经网络中,卷积操作通过滑动窗口的方式应用到输入数据上。对于二维图像处理中的卷积运算来说,假设有一个大小为 \( m \times n \) 的输入矩阵 I 和一个大小为 \( k \times l \) 的卷积核 K,则输出特征图 O 中位置 (i,j) 处的结果可以通过如下公式得到: \[O(i, j)=\sum_{u=0}^{k-1}\sum_{v=0}^{l-1}I(i+u, j+v)\cdot K(u,v)[^2]\] 这里需要注意的是,在实际实现过程中,通常会考虑边界填充(padding)、步幅(stride)等因素来调整最终输出尺寸。 为了更直观理解这个过程,可以想象将一个小方块形状的滤波器放在大图片之上,并逐步移动它;每次移动都会执行一次上述求和乘法操作,从而生成新的像素值作为输出的一部分。 ```python import numpy as np def convolve(I, K, stride=(1, 1), padding='valid'): # 获取输入矩阵与卷积核维度 h_in, w_in = I.shape[:2] kh, kw = K.shape if isinstance(padding, int): pad_h = pad_w = padding * 2 p_top = p_bottom = padding p_left = p_right = padding elif padding.lower() == 'same': output_height = ((h_in - 1) // stride[0]) + 1 output_width = ((w_in - 1) // stride[1]) + 1 total_padding_rows = max(0, (output_height - 1) * stride[0] + kh - h_in) total_padding_cols = max(0, (output_width - 1) * stride[1] + kw - w_in) half_pad_row = total_padding_rows // 2 half_pad_col = total_padding_cols // 2 p_top = half_pad_row p_bottom = total_padding_rows - half_pad_row p_left = half_pad_col p_right = total_padding_cols - half_pad_col elif padding.lower() != 'valid': raise ValueError('Padding must be an integer or one of "valid", "same".') else: p_top = p_bottom = p_left = p_right = 0 padded_I = np.pad(I, ((p_top,p_bottom),(p_left,p_right)), mode='constant') oh = (h_in + pad_h - kh)//stride[0]+1 ow = (w_in + pad_w - kw)//stride[1]+1 result = np.zeros((oh,ow)) for i in range(0,h_in,kh-stride[0]): for j in range(0,w_in,kw-stride[1]): region = padded_I[i:i+kh,j:j+kw] result[i//stride[0],j//stride[1]] = np.sum(region*K) return result ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值