对于常见的深度学习,如 CNN,RNN,DNN,GRU,LSTM,如果可以在设计模型时就能设计出模型的参数量,那对于后续的性能优化、模型部署调优都会有一个直观上的感受和帮助。
1. CNN 参数个数
常见 CNN 模型一般包含以下几种类型的层:卷积层、池化层和全连接层。假设卷积核大小为 H*W, input channel 为 I,out channel 为 O。
- 卷积层 (Convolutional Layer):
该层 filter 数量总数为 (H x W x I),每个将被映射到新的输出通道上,加上每个 filter 的计算要有一个 bias,所以总的参数数量为:(H x W x I + 1) x O
- 池化层 (Pooling Layer):
一般的池化层属于固定操作,没有权重传播
2. 全连接层参数个数
前后是 n,m 维的输入输出,所以其参数数量为 (n+1) x m
以下循环神经网络均已单层为例
3. RNN 参数个数
图上 W,U,V 在 RNN 的每一步中都是共享的参数,所以其参数量为:
Number=n2+kn+nm- n- 隐藏层的维度
- k- 输出层的维度
- m- 输入层的维度
n2 就是 W∗W 部分
kn 就是 WV 部分
nm 就是 UW 部分
4. LSTM 参数个数
LSTM 一共维护四套参数,分别对应输入门、输出门、遗忘门和候选态,总参数数量:
Number=4∗n∗(m+1+n)- n- 隐藏层的维度
- m- 输入层的维度
- 1 表示的是偏置项
例如:
1 | import torch.nn as nn |
所以参数个数为:4×512×(100+1+512)=1255424
5. GRU 参数个数
和 LSTM 类似,但是只有三套参数,更新门、重置门、候选态,总参数量为:
Number=3×n×(m+1+n)- n- 隐藏层的维度
- m- 输入层的维度
- 1 表示的是偏置项
- 实验:
1 | class MyModel(nn.Module): |
以 lstm 为例输出:
可以看到 LSTM 输出比预期的参数多了 512*4 = 2048
同样,GRU 会比预期的参数多 512*3 = 1536
似乎是多一个偏置项,但是从参考连接他人用 keras 好像没有问题,难道是框架的问题?之后再做一下实验。。