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

一文搞懂 FFN / RNN / CNN 的参数量计算公式 !!本文探讨了计算深度学习模型中前馈神经网络 循环神经网络和卷积神经网络的参数计算 强调了参数数量与计算资源 模型性能 内存需求及优化的关系 并通过 Keras 实例展示了如何计算不同网络结构的参数量

大家好,欢迎来到IT知识分享网。

文章目录


前言

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

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

1、前置条件

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

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

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

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:网络输出维度

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

num_params = (connections between layers + biases) in every layer = (i×h + h) + (h×o + o)

先来看个图例,如下:

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

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

num_params = (3×5+5) + (5×2+2) = 32

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

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()}")

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

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

3、循环神经网络RNN

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

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

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

num_params = g × [(h+i)×h + h]

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

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

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

num_params = g × [(h+i)×h + h] = 4 × [(2+3)×2 + 2] = 48

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

input = Input((None, 3)) lstm = LSTM(2)(input) model = Model(input, lstm) print(f"train params of the model is {model.count_params()}")

结果如下:

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

4、卷积神经网络CNN

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

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

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

num_params = weights + biases = [i × (f×f) × o] + o

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

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

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

num_params = [i × (f×f) × o] + o = [1 × (2×2) × 3] + 3 = 15

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

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()}")

得到结果如下:

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

5、复杂例子

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

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

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

num_params = [i × (f×f) × o] + o = [2 × (2×2) × 3] + 3 = 27

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

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()}")

得到结果如下:

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

参考: AI算法之道

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128208.html

(0)
上一篇 2025-09-02 15:10
下一篇 2025-09-02 15:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信