袁萌 2019-01-22
点击上方关注,All in AI中国
作者——Raimi Karim
5个简单的例子教你在FFNN, RNN和CNN模型中计算参数个数。
手动计算深度学习模型的参数个数往往被认为太过于琐碎,而且是在做无用功。因为你的代码已经可以为你做到这一点。但是我还是执意想写这篇文章,以便我们偶尔参考一下。下面是我们要用到的模型:
1. 前馈神经网络(FFNN)(https://towardsdatascience.com/counting-no-of-parameters-in-deep-learning-models-by-hand-8f1716241889#9fe4)
前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层,各层间没有反馈。是目前应用最广泛、发展最迅速的之一。研究从开始,目前理论研究和实际应用达到了很高的水平。
2.递归神经网络(RNN)(https://towardsdatascience.com/counting-no-of-parameters-in-deep-learning-models-by-hand-8f1716241889#192e)
递归神经网络(RNN)是神经网络的一种。单纯的RNN因为无法处理随着递归,权重指数级爆炸或消失的问题( gradient problem),难以捕捉长期时间关联;而结合不同的LSTM可以很好解决这个问题。
时间递归神经网络可以描述动态时间行为,因为和(feedforward neural network)接受较特定结构的输入不同,RNN将状态在自身网络中循环传递,因此可以接受更广泛的时间序列结构输入。手写识别是最早成功利用RNN的研究结果。
3.卷积神经网络(CNN)(https://towardsdatascience.com/counting-no-of-parameters-in-deep-learning-models-by-hand-8f1716241889#5137)
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含计算且具有深度结构的(Feedforward Neural Networks),是(deep learning)的代表算法之一 。
同时,我将使用来自Keras的api来构建模型,以便进行简单的开发,并编写干净的代码,因此让我们快速导入相关的对象:
在构建模型之后,调用model.count_params()来验证有多少参数是可训练的。
1. FFNNs
i,输入的大小
h,隐藏层的大小
o,输出的大小
对于一个隐藏层而言,
num_params
= (i×h + h×o) + (h+o)
下面让我们进行举例论述。
示例1.1:输入大小为3,隐藏层大小为5,输出大小为2
图1.1:在该前馈神经网络中,输入大小为3,隐含层大小为5,输出大小为2。图形反映了计数的单元。
i = 3
h = 5
o = 2
num_params
= (i×h + h×o) + (h+o)
=(3×5 + 5×2) + (5+2)
= 32
示例1.2:输入大小为50,隐藏层大小[100,1,100],输出大小为50
图1.2:前馈神经网络有三个隐藏层。图形不反映计数单元。
i = 50
h = 100, 1, 100
o = 50
num_params
= (i×h + h×o) + (h+o)
= (50×100 + 100×1 + 1×100 + 100×50) + (100+1+100+50)
= 10,451
2. RNNs
g,门的数量。(RNN有1个门,GRU有3个门,LSTM有4个门)
h,隐藏单元的大小
i,输入的大小
每个门的权值个数实际上是一个FFNN,有输入大小(h+ i)和输出大小h,所以每个门都有h(h +i) + h个参数。
num_params = g×(h(h + i)+ h)
示例2.1:LSTM包含两个隐藏单元和输入维度3。
图2.1 :LSTM"细胞"。源自:https://towardsdatascience.com/animated-rnn-lstm-and-gru-ef124d06cf45
g = 4 (LSTM有 4个门)
h = 2
i = 3
num_params
= g × [h(h+i) + h]
= 4 × [2(2+3) + 2]
= 48
例2.2:有5个隐藏单元的双向GRU以及输入大小为8+有50个隐藏单元的LSTM。
图2.2:由BiGRU层和LSTM层叠加的RNN。图形不反映计数单元。
有5个隐藏单元的双向GRU,输入大小为10
g = 3 (GRU有3个门)
h = 5
i= 8
num_params_layer1
= 2 × g × [h(h+i) + h] (第一项是2因为这是一个双向式)
=2 × 3 × [5(5+8) + 5]
= 420
有50个隐藏单位的LSTM
g = 4 (LSTM有4个门)
h = 50
i = 5+5(因为GRU输出是双向连接,且GRU的输出大小为5)
num_params_layer2
= g × [h(h+i) + h]
= 4 × [50(50+10) + 50]
= 12,200
total_params = 420 + 12,200 = 12,620
默认情况下,merge_mode是串联的。
CNNs
在只有一层的情况下,
i,输入通道个数
f,过滤器大小(只是长度)
o,输出通道个数。(这是由使用了多少过滤器来定义的)
每个输入通道都有一个过滤器。
num_params
= [i × (f×f) × o] + o
例3.1:1×1过滤器的灰度图像、输出通道为3
图3.1:灰度图像的卷积为2×2过滤器,输出通道为3
i = 1 (灰度图只有一个通道)
f = 2
o = 3
num_params
= [i × (f×f) × o] + o
= [1 × (2×2) × 3] + 3
= 15
例3.2:有着2×2过滤器,输出通道为1的RGB图像
每个输入特征映射都有一个过滤器。生成的卷积按元素顺序添加,并向每个元素添加一个偏差项。这将给出一个带有特征映射的输出。
图3.2:一个2×2的RGB图像的卷积过滤器输出1通道
i = 3 (RGB图像有3个通道)
f = 2
o = 1
num_params
= [i × (f×f) × o] + o
= [3 × (2×2) × 1] + 1
= 13
例3.3:图像有2个通道,2×2过滤器,和3通道的输出
每个输入的特征映射有3个过滤器(紫色、黄色、青色)。生成的卷积按元素顺序添加,并向每个元素添加一个偏差项。这给出了一个带有3个特性映射的输出。
图3.1:2通道图像的卷积为2×2过滤器,输出3频道
i = 2
f = 2
o = 3
num_params
= [i × (f×f) × o] + o
= [2 × (2×2) × 3] + 3
= 27
关于深度学习相关文章推荐:
1.《Animated RNN, LSTM and GRU》链接:https://towardsdatascience.com/animated-rnn-lstm-and-gru-ef124d06cf45
2.《Step-by-Step Tutorial on Linear Regression with Stochastic Gradient Descent》链接:https://towardsdatascience.com/step-by-step-tutorial-on-linear-regression-with-stochastic-gradient-descent-1d35b088a843
3.《10 Gradient Descent Optimisation Algorithms + Cheat Sheet》链接:https://towardsdatascience.com/10-gradient-descent-optimisation-algorithms-86989510b5e9
4.《Attn: Illustrated Attention》链接:https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3