神经网络卷积层的参数和计算量

 

普通卷积

 

1. 公式

 

计算公式

参数量=(filter size * 前一层特征图的通道数 )* 当前层filter数量

计算量 = 参数量*  输出图的尺度 

 

详细如下:

输入卷积:Win * Hin * Cin
卷积核:k * k
输出卷积:Wout * Hout * Cout

参数量:(即卷积核的参数)
k * k * Cin * Cout
或者:(k * k * Cin + 1) * Cout (包括偏置bias)
计算量:
k * k * Cin * Wout * Hout * Cout

 

 

2. 详解

2.1 参数量计算

【卷积层的参数量】

VGG-16为例,Conv1-1,输入224x224x3  ,64个 3x3 filter,输出feature map 224x224x64 。

则Conv1-1的参数量为3x3x3x64  。

同理,可以计算其它卷积层的参数量。感兴趣的同学可以自己动手算一下。

【全连接层的参数量】

上面已经说过卷积层的参数量计算方法了,那如何计算全连接层的参数量?其实和卷积层参数量的计算方法是一样的。

VGG-16最后一次卷积得到的feature map为7x7x512  ,全连接层是将feature map展开成一维向量  1x4096。实际上,我们就是用4096个 的filter去做卷积(可以理解为是一个卷积层)。

我们就可以计算第一个FC的参数量7x7x512x4096  。

1亿啊,这个数字好大的。这也是为什么说:全连接层参数冗余。全连接层参数就可占整个网络参数80%左右,好吓人的。

 

2.1 参数量计算

【卷积层的计算量】

一次卷积的计算量,如何计算呢?

以VGG-16为例,Conv1-1,输入 224x224x3 ,64个 3x3 filter,输出feature map112x112x64  。

feature map中的每一个像素点,都是64个 3x3 filter 共同作用于原图计算一次得到的,所以它的计算量为 3x3x64 。

已经知道单个像素的计算量,那乘以feature map所有像素,就是一次卷积的计算量:  112x112x3x3x3x64。

 

【全连接层的计算量】

全连接层的计算量,如何计算呢?其实和卷积层计算量的计算方法是一样的

VGG-16最后一次卷积得到的feature map为7x7x512  ,全连接层是将feature map展开成一维向量 1x4096 。则FC层的计算量为 7x7x512x1x4096。

 

 

通过以上讨论可以发现:我们需要减少网络参数时主要针对全连接层;进行计算优化时,重点放在卷积层。

 

 

参考:https://zhuanlan.zhihu.com/p/77471991

### 卷积神经网络卷积层卷积参数量计算 #### 参数量计算公式 在卷积神经网络(CNN)中,卷积层卷积核(也称为滤波器或内核)参数量取决于几个因素:输入通道数 \( C_{\text{input}} \),输出通道数 \( C_{\text{output}} \),以及卷积核的空间维度 \( K_h \times K_w \)[^4]。 具体来说,单个卷积核的参数量由其空间尺寸输入通道数目决定。如果考虑偏置项,则整个卷积层的总参数量可以通过下面的公式来表示: \[ \text{Total Parameters} = (K_h \cdot K_w \cdot C_{\text{input}} + 1) \cdot C_{\text{output}} \] 这里, - \( K_h \) \( K_w \) 是卷积核的高度宽度; - \( C_{\text{input}} \) 表示输入图像/特征图的通道数; - \( C_{\text{output}} \) 则代表该层产生的输出特征图的数量,也就是有多少个不同的卷积核被应用到同一位置上; - 加法中的 "+1" 对应于每个卷积核关联的一个偏置参数。 #### 实例说明 假设有一个卷积层配置如下: - 输入特征图大小为 \( 28\times28\times3 \) (例如RGB彩色图像) - 使用 \( 5\times5 \) 大小的卷积核 - 输出\( 6 \)张不同特性的特征图 则此情况下总的可训练参数数量为: \[ ((5 \cdot 5) \cdot 3 + 1)\cdot 6=76*6=456 \] 这意味着在这个特定设置下,卷积层共有456个权重加上对应的偏置需要学习调整。 ```python def calculate_conv_params(kernel_height, kernel_width, input_channels, output_channels): """ 计算给定规格下的卷积层参数总量 :param kernel_height: int, 卷积核高度 :param kernel_width: int, 卷积核宽度 :param input_channels: int, 输入通道数 :param output_channels: int, 输出通道数(即卷积核数量) :return: int, 总参数量 """ params_per_kernel = kernel_height * kernel_width * input_channels + 1 # 每个kernel及其bias total_parameters = params_per_kernel * output_channels # 所有kernels合计 return total_parameters # 测试函数 print(calculate_conv_params(5, 5, 3, 6)) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值