前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文搞懂 FFN / RNN / CNN 的参数量计算公式 !!

一文搞懂 FFN / RNN / CNN 的参数量计算公式 !!

作者头像
JOYCE_Leo16
发布2024-04-16 08:16:52
2510
发布2024-04-16 08:16:52
举报
文章被收录于专栏:计算机视觉计算机视觉
文章目录

前言

1、前置条件

2、前馈神经网络FFN

3、循环神经网络RNN

4、卷积神经网络CNN

5、复杂例子


前言

为什么我们需要了解计算深度学习模型中的参数数量?

  • 计算复杂性和资源需求:模型参数越多,通常需要的计算资源(如处理器时间和内存)也越多,了解参数数量有助于估计训练和推理过程中的资源需求。
  • 模型性能:容量越大的模型可以捕获更复杂的模式,但也容易过拟合,即在训练数据上表现良好但在未见过的数据上表现差,因此,了解参数数量有助于在模型复杂性和泛化能力之间取得平衡。
  • 内存需求:对于有限的硬件资源,如移动设备和嵌入式系统,了解参数数量有助于设计合适的模型结构。
  • 调优和优化:了解模型的参数数量有助于调优超参数,比如学习率和正则化项。

1、前置条件

为了详细说明,本文重点介绍三类网络训练参数的计算方式:

  • Feed-Forward Neural Network(FFN)
  • Recurrent Neural Network(RNN)
  • Convolutional Neural Network(CNN)

同时,本文将使用Keras的API构建模型,以方便模型设计和编写简洁的代码。首先导入相关的库函数:

代码语言:javascript
复制
from keras.layers import Input, Dense, SimpleRNN, LSTM, GRU, Conv2D
from keras.layers import Bidirectional
from keras.models import Model

使用上述库函数在建立模型后,通过调用 model.count_params() 来验证有多少参数用以训练。

2、前馈神经网络FFN

前馈神经网络相对比较简单,多个全连接层构成的网络结构,我们不妨假设:

  • i:输入维度
  • h:隐藏层大小
  • o:网络输出维度

那么一个隐藏层的参数的计算公式为:

代码语言:javascript
复制
num_params = (connections between layers + biases) in every layer
           = (i×h + h) + (h×o + o)

先来看个图例,如下:

观察上述图例中,我们知道 i=3,h=5,o=2,带入上述公式,得到的训练参数量为:

代码语言:javascript
复制
num_params = (3×5+5) + (5×2+2)
           = 32

我们用代码实现上述过程,如下:

代码语言:javascript
复制
input = Input((None, 3))
dense = Dense(5)(input)
output= Dense(2)(dense)
model = Model(input, output)
print(f"train params of the model is {model.count_params()}")

运行上述代码,得到结果如下:

3、循环神经网络RNN

前馈神经网络里相对简单,我们接下来分析循环神经网络的参数计算方式,这里假设:

  • g:一个单元中的FFN数量(一般来说,RNN结构中FFN数量为1,而GRU结构中FFN数量为3个,LSTM结构中FFN数量为4个)
  • h:隐藏单元的大小
  • i:输入大小

RNN中对于每个FFN,最开始输入状态和隐藏状态是concat在一起作为输入的,因此每个FFN具有 (h+i) x h + h 个参数。所以总的参数量的计算公式为:

代码语言:javascript
复制
num_params = g × [(h+i)×h + h]

我们来看以下LSTM的例子,含有2个隐藏单元,输入维度为3,图示如下:

观察上图,我们将 g=4,h=2,i=3 带入上式,得到上述LSTM的参数量为:

代码语言:javascript
复制
num_params = g × [(h+i)×h + h] 
           = 4 × [(2+3)×2 + 2] 
           = 48

我们用代码验证上述过程,如下:

代码语言:javascript
复制
input = Input((None, 3))
lstm  = LSTM(2)(input)
model = Model(input, lstm)
print(f"train params of the model is {model.count_params()}")

结果如下:

4、卷积神经网络CNN

对于卷积神经网络,我们主要观察卷积层,这里对每一层的卷积,我们假设:

  • i:输入特征图的通道数
  • f:滤波器的尺寸
  • o:输出的通道数(等于滤波器的个数)

则对应卷积层的参数量计算公式为:

代码语言:javascript
复制
num_params = weights + biases 
           = [i × (f×f) × o] + o

我们来看个例子,对灰度图像使用 2x2 滤波器,输出为3个通道,图示如下:

观察上图,我们知道 i=1,f=2,o=3 带入上式,得到结果为:

代码语言:javascript
复制
num_params = [i × (f×f) × o] + o 
           = [1 × (2×2) × 3] + 3 
           = 15

我们用代码进行验证,如下所示:

代码语言:javascript
复制
input  = Input((None, None, 1))
conv2d = Conv2D(kernel_size=2, filters=3)(input)
model  = Model(input, conv2d)
print(f"train params of the model is {model.count_params()}")

得到结果如下:

5、复杂例子

由于卷积神经网络多在计算机视觉领域得到应用,我们再来看个稍微复杂点的例子,针对2个通道输入使用32x2 的卷积核进行卷积操作,图示如下:

观察上图,我们知道 i=2,f=2,o=3 带入上式,得到结果为:

代码语言:javascript
复制
num_params = [i × (f×f) × o] + o 
           = [2 × (2×2) × 3] + 3 
           = 27

我们用代码进行验证,如下所示:

代码语言:javascript
复制
input  = Input((None, None, 2))
conv2d = Conv2D(kernel_size=2, filters=3)(input)
model  = Model(input, conv2d)
print(f"train params of the model is {model.count_params()}")

得到结果如下:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 1、前置条件
  • 2、前馈神经网络FFN
  • 3、循环神经网络RNN
  • 4、卷积神经网络CNN
  • 5、复杂例子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档