如何计算卷积层的参数个数

一般文献中卷积过程多是对一个通道的图像进行卷积, 但实际中图篇是多通道的,卷积核个数也大于1。比如10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定不是的。 输出的个数依然是 卷积核的个数,仍然是10个featuremap, 每一层输出feature map 个数 就是该层卷积核的个数。

实际上,卷积操作通过卷积核的个数可以灵活的将数据映射到更高维或更低维。

卷积神经网络

这里写图片描述

多通道多个卷积核

下图展示了在四个通道上的卷积操作,有两个卷积核,生成两个通道。其中需要注意的是,四个通道上每个通道对应一个2*2的卷积核,这4个2*2的卷积核上的参数是不一样的,之所以说它是1个卷积核,是因为把它看成了一个4*2*2的卷积核,4代表一开始卷积的通道数,2*2是卷积核的尺寸,实际卷积的时候其实就是4个2*2的卷积核(这四个2*2的卷积核的参数是不同的)分别去卷积对应的4个通道,然后相加,再加上偏置b,注意b对于这四通道而言是共享的,所以b的个数是和最终的featuremap的个数相同的,先将w2忽略,只看w1,那么在通道的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加,再加上偏置b1,然后再取激活函数值得到的。 所以最后得到两个feature map, 即输出层的卷积核个数为 feature map 的个数。也就是说

  • 卷积核的个数=最终的featuremap的个数
  • 卷积核的大小=开始进行卷积的通道数×每个通道上进行卷积的二维卷积核的尺寸
  • 参数的个数=卷积核个数×(卷积核大小+1)

    此处就是参数W的个数是4*(2*2)),b(偏置)的个数=卷积核的个数=featuremap的个数。

下图中k代表featuremap的个数,W的大小是(4*2*2)
这里写图片描述
卷积神经网络
这里写图片描述

所以,在上图由4个通道卷积得到2个通道的过程中,参数的数目为4×(2×2)×2+2个,其中4表示4个通道,第一个2*2表示卷积核的大小,第三个2表示featuremap个数,也就是生成的通道数,最后的2代表偏置b的个数。

同理,经典的LeNet中,箭头所处的转换所用的卷积核张量为16*6*10*10,即16个6*10*10的卷积核,卷积核的大小为10*10。 参数的数目为16*(6*10*10+1)个。
这里写图片描述

参考:
https://blog.csdn.net/dulingtingzi/article/details/79819513

### 卷积神经网络中卷积层参数数量计算 在卷积神经网络(CNN)中,卷积层参数主要由滤波器(kernel)决定。这些参数数量可以通过以下公式进行计算: #### 参数数量计算公式 对于单个卷积核而言,其参数数量可以表示为: \[ \text{参数数量} = (k_h \times k_w \times d_{\text{in}}) + b \] 其中: - \( k_h \): 卷积核的高度。 - \( k_w \): 卷积核的宽度。 - \( d_{\text{in}} \): 输入通道数(即上一层的输出通道数或输入图像的颜色通道数,例如 RGB 图像有 3 个通道)。 - \( b \): 偏置项的数量,默认情况下每个卷积核对应一个偏置。 如果该卷积层中有多个卷积核,则总参数数量为: \[ \text{总参数数量} = m \times ((k_h \times k_w \times d_{\text{in}}) + 1) \] 这里 \( m \) 表示卷积核数量(也称为输出通道数)。注意,在某些实现中可能不使用偏置项,此时需去掉 \( +1 \)[^1]。 #### 示例说明 假设有一个卷积层配置如下: - 输入尺寸:\( 28 \times 28 \times 3 \) (高度×宽度×通道) - 卷积核大小:\( 3 \times 3 \) - 输出通道数:64 - 使用偏置项 则此卷积层参数总数为: \[ \text{总参数数量} = 64 \times ((3 \times 3 \times 3) + 1) = 64 \times (27 + 1) = 64 \times 28 = 1792 \][^3] #### 特殊情况考虑 当卷积层采用深度可分离卷积(Depthwise Separable Convolution)时,参数数量会显著减少。这是因为深度可分离卷积分为两步完成:第一步是对每个输入通道单独应用卷积操作;第二步是跨通道线性组合结果。这种设计减少了传统卷积所需的大量参数[^1]。 ```python def calculate_conv_params(kernel_height, kernel_width, input_channels, output_channels, use_bias=True): params_per_filter = kernel_height * kernel_width * input_channels if use_bias: total_params = output_channels * (params_per_filter + 1) else: total_params = output_channels * params_per_filter return total_params # 计算示例 total_parameters = calculate_conv_params(3, 3, 3, 64) print(f"Total parameters: {total_parameters}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值