专栏首页AI研习社手动计算深度学习模型中的参数数量

手动计算深度学习模型中的参数数量

本文为 AI 研习社编译的技术博客,原标题 : Counting No. of Parameters in Deep Learning Models by Hand 作者 | Raimi Karim 翻译 | Snowdrop99 校对 | 斯蒂芬·二狗子 审核 | 酱番梨 整理 | 立鱼王 原文链接: https://towardsdatascience.com/counting-no-of-parameters-in-deep-learning-models-by-hand-8f1716241889

摄影:Andrik Langfield,来自Unsplash

为什么我们需要再次计算一个深度学习模型中的参数数量?我们没有那样去做。然而,当我们需要减少一个模型中的文件大小甚至是减少模型推理的时间时,我们知道模型量化前后的参数数量是派得上用场的。(请点击原文查阅深度学习的高效的方法和硬件的视频。)

计算深度学习模型中可训练参数的数量被认为是微不足道的,因为你的代码已经可以为你完成这些任务。但是我依然想在这里留下我的笔记以供我们偶尔参考。以下是我们将要运行的模型:

  1. 前馈神经网络 (FFNN)
  2. 循环神经网络(RNN)
  3. 卷积神经网络(CNN)

与此同时,我会用Keras的API创建一个模型,以便简单的原型设计和代码的整洁,因此我们在此快速import导入相关的对象:

from keras.layers import Input, Dense, SimpleRNN, LSTM, GRU, Conv2D
from keras.layers import Bidirectional
from keras.models import Model

建立模型后,使用model.count_params()来查看有多少参数是可训练的。

1. FFNNs

  • i, 输入大小
  • h, 隐藏层的大小
  • o, 输出大小

对于一个隐藏层,

参数数量

=层间的连接+每层的偏差

=(i×h+h×o)+(h+o)

例1.1:输入大小为3,隐藏层大小为5,输出大小为2

图1.1:输入大小为3,隐藏层大小为5,输出大小为2的FFNN。图形反映了实际的单元数量。

  • i = 3
  • h = 5
  • o = 2

参数数量

=层间的连接+每层的偏差

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

=32

 input = Input((None, 3))
 dense = Dense(5)(input)
output = Dense(2)(dense)
 model = Model(input, output)

例1.2:输入大小为50,隐藏层大小[100,1,100],输出大小为50

图1.2:3层隐藏层的FFNN。图形没有反映出实际的单元数量。

  • i = 50
  • h = 100, 1, 100
  • o = 50

参数数量

=层间的连接+每层的偏差

=(50×100+100×1+1×100+100×50)+(100+1+100+50)

=10,451

input = Input((None, 50))
 dense = Dense(100)(input)
 dense = Dense(1)(dense)
 dense = Dense(100)(dense)
output = Dense(50)(dense)
 model = Model(input, output)

2. RNNs

  • g, 一个单元中的FFNNs的数量(RNN有1个,GRU有3个,LSTM有4个)
  • h, 隐藏单元的大小
  • i,输入的维度/大小

因为每一个FFNN有h(h+i)+h个参数,则我们有

参数数量=g×[h(h+i)+h]

例2.1:LSTM有两个隐藏单元,输入维度为3.

图2.1:一个LSTM单元。

  • g = 4 (LSTM有4个FFNN)
  • h = 2
  • i = 3

参数数量 = g × [h(h+i) + h] = 4 × [2(2+3) + 2] = 48

input = Input((None, 3))
 lstm = LSTM(2)(input)
model = Model(input, lstm)

例2.2:堆叠双向GRU有5个隐藏单元,输入大小为8(其输出是级联的)+LSTM有50个隐藏单元。

图2.2:一个堆叠RNN包含有BiGRU和LSTM层。该图形没有反映出实际的单元数。

双向GRU有5个隐藏层,输入大小为10,

  • g = 3 ( GRU有3个FFNN)
  • h = 5
  • i = 8

第一层的参数数量

= 2 × g × [h(h+i) + h] (由于双向性,则第一项是2)

= 2 × 3 × [5(5+8) + 5] = 420

LSTM有50个隐藏单元

  • g = 4 (LSTM有4个FFNN)
  • h = 50
  • i = 5+5 (双向GRU级联的输出;GRU的输出大小为5;隐藏单元数同为5)

第二层的参数数量 = g × [h(h+i) + h] = 4 × [50(50+10) + 50] = 12,200

总的参数数量= 420 + 12,200 = 12,620

input = Input((None, 8))
layer1 = Bidirectional(GRU(5, return_sequences=True))(input)
layer2 = LSTM(50)(layer1)
 model = Model(input, layer2)

merge_mode默认是串联的。

CNNs

对于一层,

  • i, 输入映射的数量(或通道)no. of input maps (or channels)
  • f, 滤波器大小(仅仅是长度)filter size (just the length)
  • o, 输出映射的数量(或通道。这也由使用了多少滤波器来定义)

一个滤波器被应用于每一个输入映射。

参数数量 = weights + biases

= [ i × ( f × f ) × o] + o

例3.1:1×1滤波器的灰度图,输出3个通道

图3.1:使用2×2滤波器对灰度图像进行卷积以输出3个通道。 这里有15个参数--12个权重和3个偏差。

  • i = 1 (灰度图只有一个通道)
  • f = 2
  • o = 3

参数数量 = [ 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)

例3.2:RGB图像有2×2滤波器,输出一个通道

每一个输入特征映射都有一个滤波器。产生的卷积按元素添加,并且向每个元素添加偏差项。 这给出了具有一个特征映射的输出。

图3.2 :使用2×2滤波器对RGB图像进行卷积以输出一个通道 。这里有13个参数--12个权重和一个偏差。

  • i = 3 (RGB图像有3个通道)
  • f = 2
  • o = 1

参数数量 = [i × ( f × f ) × o] + o = [3 × (2×2) × 1] + 1 = 13

input = Input((None, None, 3))
conv2d = Conv2D(kernel_size=2, filters=1)(input)
 model = Model(input, conv2d)

例3.3:一张图像有2个通道,2×2滤波器和3通道的输出

每一个输入特征映射有3个滤波器(紫色,黄色,青色)。产生的卷积按元素添加,并且向每个元素添加偏差项。 这给出了具有3个特征映射的输出。

图3.1:对一个2通道的2×2滤波器的图像进行卷积以输出3个通道。这里有27个参数--24个权重和3个偏差。

  • i = 2
  • f = 2
  • o = 3

参数数量 = [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)

目前为止就这样了! 如果您有任何反馈,请在下面留言!

本文分享自微信公众号 - AI研习社(okweiwu),作者:雷锋字幕组

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何使用 TensorFlow mobile 将 PyTorch 和 Keras 模型部署到移动设备

    截止到今年,已经有超过 20 亿活跃的安卓设备。安卓手机的迅速普及很大程度上是因为各式各样的智能 app,从地图到图片编辑器应有尽有。随着深度学习的出现,我们的...

    AI研习社
  • 迁移学习:如何将预训练CNN当成特征提取器

    深度学习的魅力在于预训练好的模型能够对完全不同的数据集进行分类。这种能力内用了这些深度神经网络结构(在ImageNet数据集上进行过训练)的预训练权重并把其应用...

    AI研习社
  • 如何使用高大上的方法调参数

    本文主要介绍作者与 Elad Hazan, Adam Klivans 合作的最新论文: Hyperparameter Optimization: A Spec...

    AI研习社
  • js逐步教实现表单系统

    注意一下;第一:取消系统默认的事件, 最重要的一点在于是否每一个都填了. 所以:

    用户7873631
  • C++中std::getline()函数的用法

    1) 的行为就像UnformattedInputFunction, 除了input.gcount()不会受到影响.在构造和检查岗哨对象的, 执行以下操作:

    Enjoy233
  • [javascript] vuejs为输入框增加回车事件

    陶士涵
  • Python基础 input()的使用

    py3study
  • 首个小程序权威奖项诞生!每周评选一款最好的小程序

    知晓君
  • Pandas中groupby的这些用法你都知道吗?

    pandas作为Python数据分析的瑞士军刀,集成了大量实用的功能接口,基本可以实现数据分析一站式处理。前期,笔者完成了一篇pandas系统入门教程,也针对几...

    luanhz
  • 大数据存储HDFS详解

    Google Protocol Buffers(ProtoBuf):只有序列化功能,不具备RPC功能。

    凹谷

扫码关注云+社区

领取腾讯云代金券