卷积层详解/多通道多特征图卷积详细步骤/彻底搞懂卷积层输入输出尺寸shape

悟已往之不谏,知来者之可追。
实迷途其未远,觉今是而昨非。
–<晋>陶渊明

0. 前(fei)言(hua)

我曾经以为我是天下第一倒霉蛋,既不是富二代,也谈不到恋爱,脑子也是笨蛋,又是高度近视,直到考上研才发现我其实一直都很走运,尤其是在这种重要的人生节点,我总是能走运,获得我的努力配不上的成绩。虽然我不信命运,但是既受此天恩,又岂能不抚壮而弃秽兮?

大二的时候用C++写过全连接的网络,很简单,现在有个网络需要部署在开发板上,内存1M,除了用cpp写我想不出别的办法了;往年竟然有人在这板子上面跑python,我只能说是我孤陋寡闻了。奈何笨鸟先飞,虽然用cpp重构费事了些,但是也不妨为一个很好的练手程序。我听说同校有的社团大一招新就是手写卷积层,确实是我菜了。我一直以为卷积层这玩意谁不会啊,对应位置相乘,一个块移来移去的,小学生理解起来也没有什么问题。但是当输入图像是多通道、feature map产生多个的时候呢?你还是能完全清楚的说出计算过程吗?恐怕未必很多人能够完整说出。网上类似的文章虽然有很多,但我总感觉读起来隔靴搔痒,太过学术,不得其中门道,故斗胆撰文,谨抛砖引玉,若能启读者之思,则诚为我之幸甚。若有疏漏,恳请诸位读者斧正。

1. 卷积层的性质

我们都知道,卷积层在keras中是这样定义的:

layers.Conv2D(
        input_shape=(pic_width, pic_height
<think>嗯,用户想了解卷积神经网络卷积层的运算公式。我需要先回忆一下相关的知识。卷积层CNN的核心部分,用于特征提取。运算公式可能涉及卷积操作的具体步骤,比如输入、卷积核、步长、填充等参数的影响。 根据引用[2]提到的输出特征图大小的计算,可能需要先介绍公式。输出尺寸通常由输入尺寸、卷积核大小、步长和填充决定。公式应该是:输出高度 = (输入高度 + 2*填充 - 卷积核高度)/步长 + 1,宽度同理。然后具体到每个元素的运算,每个输出特征图的元素是输入对应区域与卷积核的点积,再加上偏置项。 还要注意通道数,比如输入是三维的(通道、高度、宽度),卷积核也是三维的(输出通道、输入通道、高度、宽度)。每个输出通道的卷积核与输入的所有通道进行卷积,然后求和,加上偏置,得到该输出通道的一个元素。这一点可能用户需要明确,尤其是多通道的情况。 可能用户需要具体的数学表达式,比如用求和符号表示卷积运算,涉及输入的不同位置和卷积核的权重相乘,再加上偏置。引用[3]和[4]提到局部连接和权值共享,这也是卷积层的重要特性,应该在公式中体现出来。 需要检查LaTeX格式是否正确,比如使用$$...$$表示独立公式,行内公式用$...$。确保没有语法错误,比如正确的括号和符号。然后生成相关问题,比如输出尺寸计算、通道作用、步长影响等,帮助用户深入理解。</think>### 卷积层运算公式详解 卷积层的核心运算是通过**卷积核(滤波器)**在输入数据上滑动,计算局部区域的加权和。以下是其数学公式及关键参数说明: #### 1. **基本运算公式** 设输入特征图为 $X \in \mathbb{R}^{C_{in} \times H_{in} \times W_{in}}$(通道数×高度×宽度),卷积核为 $K \in \mathbb{R}^{C_{out} \times C_{in} \times k \times k}$(输出通道数×输入通道数×核大小×核大小),偏置为 $b \in \mathbb{R}^{C_{out}}$,则输出特征图 $Y$ 的第 $(i,j)$ 个元素计算如下: $$Y_{c,i,j} = \sum_{c'=1}^{C_{in}} \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} K_{c,c',m,n} \cdot X_{c', (i \cdot s + m - p), (j \cdot s + n - p)} + b_c$$ 其中: - $s$:步长(stride) - $p$:填充(padding) - $k$:卷积核尺寸 #### 2. **输出特征图尺寸计算** 输出尺寸由以下公式确定: $$H_{out} = \left\lfloor \frac{H_{in} + 2p - k}{s} \right\rfloor + 1$$ $$W_{out} = \left\lfloor \frac{W_{in} + 2p - k}{s} \right\rfloor + 1$$ 当使用**空洞卷积(Dilated Convolution)**时,公式需调整核的有效尺寸[^3]。 #### 3. **多通道卷积示例** 以RGB图像(3通道)为例,单个卷积核包含3个子核,分别与3个输入通道进行卷积,结果相加后加上偏置: $$Y_{i,j} = \left( \sum_{c=1}^3 K_c \ast X_c \right) + b$$ #### 4. **Python实现片段(简化版)** ```python import numpy as np def conv2d(input, kernel, stride=1, padding=0): # 添加填充 input_padded = np.pad(input, padding, mode='constant') # 计算输出尺寸 H_out = (input.shape[0] + 2*padding - kernel.shape[0]) // stride + 1 W_out = (input.shape[1] + 2*padding - kernel.shape[1]) // stride + 1 output = np.zeros((H_out, W_out)) # 滑动窗口计算 for i in range(H_out): for j in range(W_out): h_start = i * stride h_end = h_start + kernel.shape[0] w_start = j * stride w_end = w_start + kernel.shape[1] output[i,j] = np.sum(input_padded[h_start:h_end, w_start:w_end] * kernel) return output + bias # 添加偏置 ``` --- ### 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值