手工计算深度学习模型中的参数数量
计算深度学习模型的可训练参数的数量被认为太微不足道了,因为您的代码已经可以为您完成此操作。但是我想在这里留下笔记,让我们偶尔参考一下。以下是我们将要运行的神经网络模型:
- 前馈神经网络(FFNN)
- 循环神经网络(RNN)
- 卷积神经网络(CNN)
我们将使用Keras的API构建机器学习模型,以便于原型设计和干净的代码,因此我们可以在此处快速导入依赖库:
构建之后model,调用model.count_params()以验证可训练的参数数量。
1. 前馈神经网络(FFNN)
- i, 输入大小
- h,隐藏层的大小
- o,输出大小
对于一个隐藏层,
num_params
=各层之间的连接+每层中的偏差
= (i×h + h×o)+(h + o)
例1.1:输入大小为3,隐藏层大小为5,输出大小为2
图1.1
- i = 3
- h = 5
- o = 2
num_params
=各层之间的连接+每层中的偏差
= (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
=各层之间的连接+每层中的偏差
= (50×100 + 100×1 + 1×100 + 100×50)+(100 + 1 + 100 + 50)
= 10,451
2. 循环神经网络(RNN)
- 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:具有2个隐藏单元和输入大小为3的LSTM。
图2.1:LSTM cell
- g = 4(LSTM有4个门)
- h = 2
- i= 3
num_params
= g ×[ h(h + i)+ h ]
= 4 ×[2(2 + 3)+ 2]
= 48
例2.2:具有5个隐藏单元和输入大小为8(其输出串联)+ LSTM(50个隐藏单元)的堆叠双向GRU
图2.2:由BiGRU和LSTM层组成的堆叠RNN
双向GRU,5个隐藏单元,输入大小8
- 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
LSTM有50个隐藏单位
- g = 4(LSTM有4个门)
- h = 50
- i = 5 + 5(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 默认情况下是串联。
3.卷积神经网络(CNN)
对于一层,
- i,输入映射(或通道)的数量
- f,filter size
- o,输出映射(或通道。这也是由使用了多少个filters定义的)的数量
一个filter应用于每个输入映射。
num_params
=权重+偏差
= [ i×(f×f)×o ] + o
例3.1:灰度图像,输出3个通道
图3.1:使用2 ×2 filter对灰度图像进行卷积 输出3个通道
- i = 1(灰度只有1个通道)
- f = 2
- o = 3
num_params
= [ i×(f×f)×o ] + o
= [1 ×(2 × 2)× 3] + 3
= 15
例3.2:RGB图像,1通道的输出
每个输入特征映射都有一个过滤器。生成的卷积按元素顺序添加,并向每个元素添加一个偏差项。这将给出一个带有1个feature map的输出。
图3.2:使用2 ×2 filter将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个通道的图像,以及3个通道的输出
每个输入feature map有3个filters(紫色、黄色、青色)。生成的卷积按元素顺序添加,并向每个元素添加一个偏差项。这给出了一个带有3个特性映射的输出。
图3.1:2通道图像,2 ×2 filter, 输出3个通道
这里有27个参数--24个权重和3个偏差。
- i = 2
- f = 2
- o = 3
num_params
= [ i×(f×f)×o ] + o
= [2 ×(2×2)×3] + 3 = 27