如何计算神经网络的参数量以及创建多隐藏层网络(总参数量接近)
文章目录
- 计算神经网络的参数量
- 创建多隐藏层的网络
- 构建总参数量接近的神经网络
计算神经网络的参数量
对于全连接层来说,其单层的参数量为 (输入维度 + 1) * 该层神经元个数
。这是因为全连接层的每个神经元都需要一个 权重向量
和一个 偏置值
来计算其输出,权重向量
的长度就是 输入维度
,偏置值
是一个标量。
若当前 network
有 hidden_layers
层 hidden layer
,其中每层 hidden_layer
有 hidden_dim
维,则有:
T o t a l _ p a r a m s = ( i n p u t _ d i m + 1 ) ∗ h i d d e n _ d i m + ( h i d d e n _ d i m + 1 ) ∗ h i d d e n _ d i m ∗ ( h i d d e n _ l a y e r s − 1 ) + ( h i d d e n _ d i m + 1 ) ∗ o u t p u t _ d i m Total\_params = (input\_dim + 1) * hidden\_dim + (hidden\_dim + 1) * hidden\_dim * (hidden\_layers - 1) + (hidden\_dim + 1) * output\_dim Total_params=(input_dim+1)∗hidden_dim+(hidden_dim+1)∗hidden_dim∗(hidden_layers−1)+(hidden_dim+1)∗output_dim
对于一个神经网络来说,其总参数量就是所有全连接层的参数量之和。例如,如果我们有一个神经网络,它有一个输入层(输入维度为 4),一个隐藏层(隐藏层神经元个数为 5),和一个输出层(输出维度为 3),那么它的总参数量就是:
输入层到隐藏层的全连接层: ( 4 + 1 ) ∗ 5 = 25 (4 + 1) * 5 = 25 (4+1)∗5=25
隐藏层到输出层的全连接层: ( 5 + 1 ) ∗ 3 = 18 (5 + 1) * 3 = 18 (5+1)∗3=18
总参数量: 25 + 18 = 43 25 + 18 = 43 25+18=43
创建多隐藏层的网络
那么该如何创建多隐藏层的网络,顺便打印参数量呢?
这里举个例子说明:
import torch.nn as nninput_dim = 8
hidden_dim = 16
hidden_layers = 2
output_dim = 8# 为了简洁,舍去了 Relu()
network = nn.Sequential(nn.Linear(input_dim, hidden_dim),# 在函数的调用中,一个 * 表示将一个序列展开为单独的位置参数,这一行代码是列表推导,最终的表现是重复生成多个 hidden layer*[nn.Linear(hidden_dim, hidden_dim) for _ in range(hidden_layers-1)], nn.Linear(hidden_dim, output_dim))
# 打印总参数量
total_params = ((input_dim+1) * hidden_dim +(hidden_dim + 1) * hidden_dim * (hidden_layers - 1) +(hidden_dim + 1) * output_dim
)
print(f'Total params: {total_params}')
>> Total params: 552
当然,实际上你可以直接使用 pytorch 中的函数进行打印
total_params = sum(param.numel() for param in network.parameters())
print(f'Total params: {total_params}')
>> Total params: 552
进一步的,如果你想查看各层分别的参数量,你可以使用以下代码
for name, param in network.named_parameters():print(name, param.numel())
0.weight 128
0.bias 16
1.weight 256
1.bias 16
2.weight 128
2.bias 8
其中 weight
对应的是权重,bias
是偏差。
构建总参数量接近的神经网络
这个视频片段能够让你更好的了解 Deep Network 和 Shallow network 的差异:Why Deep Learning?
已知神经网络的总参数量由下式给出:
T o t a l _ p a r a m s = ( i n p u t _ d i m + 1 ) ∗ h i d d e n _ d i m + ( h i d d e n _ d i m + 1 ) ∗ h i d d e n _ d i m ∗ ( h i d d e n _ l a y e r s − 1 ) + ( h i d d e n _ d i m + 1 ) ∗ o u t p u t _ d i m Total\_params = (input\_dim + 1) * hidden\_dim + (hidden\_dim + 1) * hidden\_dim * (hidden\_layers - 1) + (hidden\_dim + 1) * output\_dim Total_params=(input_dim+1)∗hidden_dim+(hidden_dim+1)∗hidden_dim∗(hidden_layers−1)+(hidden_dim+1)∗output_dim
为了符号简便,做以下简写:
- i = i n p u t _ d i m i = input\_dim i=input_dim
- o = o u t p u t _ d i m o = output\_dim o=output_dim
- l = h i d d e n _ l a y e r s l = hidden\_layers l=hidden_layers
- d = h i d d e n _ d i m d = hidden\_dim d=hidden_dim
有:
T o t a l _ p a r a m s = ( i + 1 ) ∗ d + ( d + 1 ) ∗ d ∗ ( l − 1 ) + ( d + 1 ) ∗ o Total\_params = (i + 1) * d + (d + 1) * d * (l - 1) + (d + 1) * o Total_params=(i+1)∗d+(d+1)∗d∗(l−1)+(d+1)∗o
进一步的,将其化成一元二次方程的形式,其中 d d d 为自变量:
T o t a l _ p a r a m s = ( l − 1 ) ∗ d 2 + ( i + o + l ) ∗ d + o Total\_params = (l - 1) * d^2 + (i + o + l) * d + o Total_params=(l−1)∗d2+(i+o+l)∗d+o
假设 i , o , l , d i, o, l, d i,o,l,d 均为已知量,现在需要求:在输入输出维度不变的情况下,当 d e s t _ h i d d e n _ l a y e r s dest\_hidden\_layers dest_hidden_layers 给定时,隐藏层的维数等于多少才能让两个网络的总参数量接近?( d e s t dest dest 代指我们要计算的目标网络)
同样的,做以下简写:
- l d = d e s t _ h i d d e n _ l a y e r s l_d = dest\_hidden\_layers ld=dest_hidden_layers
- d d = d e s t _ h i d d e n _ d i m d_d = dest\_hidden\_dim dd=dest_hidden_dim
则有:
d e s t _ T o t a l _ p a r a m s = ( l d − 1 ) ∗ d d 2 + ( i + o + l d ) ∗ d d + o dest\_Total\_params = (l_d - 1) * d_d^2 + (i + o + l_d) * d_d + o dest_Total_params=(ld−1)∗dd2+(i+o+ld)∗dd+o
令 d e s t _ T o t a l _ p a r a m s = T o t a l _ p a r a m s dest\_Total\_params = Total\_params dest_Total_params=Total_params:
( l d − 1 ) ∗ d d 2 + ( i + o + l d ) ∗ d d + o = ( l − 1 ) ∗ d 2 + ( i + o + l ) ∗ d + o ⇓ ( l d − 1 ) ∗ d d 2 + ( i + o + l d ) ∗ d d − ( l − 1 ) ∗ d 2 − ( i + o + l ) ∗ d = 0 (l_d - 1) * d_d^2 + (i + o + l_d) * d_d + o = (l - 1) * d^2 + (i + o + l) * d + o\\\Downarrow\\ (l_d - 1) * d_d^2 + (i + o + l_d) * d_d - (l - 1) * d^2 - (i + o + l) * d = 0 (ld−1)∗dd2+(i+o+ld)∗dd+o=(l−1)∗d2+(i+o+l)∗d+o⇓(ld−1)∗dd2+(i+o+ld)∗dd−(l−1)∗d2−(i+o+l)∗d=0
这实际上是一个一元二次方程,其中 d d d_d dd 为自变量,其余均已知,可当作常数看待。令
a = l d − 1 , b = i + o + l d , c = − ( l − 1 ) ∗ d 2 − ( i + o + l ) ∗ d a = l_d - 1,\\ b = i + o + l_d,\\ c = - (l - 1) * d^2 - (i + o + l) * d a=ld−1,b=i+o+ld,c=−(l−1)∗d2−(i+o+l)∗d
则上式可化成 a ∗ d d 2 + b ∗ d d + c = 0 a * d_d^2 + b *d_d + c = 0 a∗dd2+b∗dd+c=0
由一元二次方程的求根公式
y = − b ± b 2 − 4 a c 2 a y = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} y=2a−b±b2−4ac
有
d d = − ( i + o + l d ) ± ( i + o + l d ) 2 − 4 ( l d − l ) ( − ( ( l − 1 ) ∗ d 2 − ( i + o + l ) ∗ d ) ) 2 ( l d − l ) d_d = \frac{-(i+o+l_d) \pm \sqrt{(i+o+l_d)^2 - 4(l_d-l)(-((l - 1) * d^2 - (i + o + l) * d))}}{2(l_d-l)} dd=2(ld−l)−(i+o+ld)±(i+o+ld)2−4(ld−l)(−((l−1)∗d2−(i+o+l)∗d))
你可以通过调用下方代码中的 get_dest_dim()
获取目标网络隐藏层应该设置的维度。
def get_dest_dim(input_dim, output_dim, hidden_layers, dest_hidden_layers, hidden_dim):'''获取目标网络隐藏层的维度(总参数量接近于原网络)'''# 计算一元二次方程的系数 a,b,ca = dest_hidden_layers - 1 # a = l_d - 1b = input_dim + output_dim + dest_hidden_layers # b = i + o + l_dc = - (hidden_layers - 1) * (hidden_dim ** 2) - (input_dim + output_dim + hidden_layers) * hidden_dim # c = - (l - 1) * (d ** 2) - (i + o + l) * d# 计算分子中的平方根部分,即 b^2-4acsqrt_part = (b ** 2) - 4 * a * c# 计算两个解,一个是加号,一个是减号,即(-b±√(b^2-4ac))/(2a)d_d_plus = (-b + sqrt_part**(0.5)) / (2 * a)d_d_minus = (-b - sqrt_part**(0.5)) / (2 * a)# 返回两个解的元组return (d_d_plus, d_d_minus)# 设置你想要的目标网络隐藏层数量
dest_hidden_layers = 2# 获取对应的维数
dest_hidden_dim, _ = get_dest_dim(input_dim, output_dim, hidden_layers, dest_hidden_layers, hidden_dim)
print(f"若将隐藏层网络层数改为: {dest_hidden_layers},则维数应当改为: {round(dest_hidden_dim)}",)
参考链接:
图源自《动手学深度学习》
HW02 的 Sample code
如何计算神经网络的参数量以及创建多隐藏层网络(总参数量接近)相关推荐
- 卷积神经网络的参数量和计算量
<卷积神经网络的参数量和计算量> 对于在端部署的模型来说,模型的参数量以及计算量是锱铢必较的,使用什么样的激活函数,会有多大的计算成本.对于模型的压缩量化等都是模型的参数量和计算量的准 ...
- [Pytorch系列-41]:卷积神经网络 - 模型参数的恢复/加载 - 搭建LeNet-5网络与MNIST数据集手写数字识别
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- bp神经网络,多输入多输出,3层网络matlab程序
1 项目背景 一个数据集,满足多对多 的对应关系.他希望用神经网络解决它的数据集逆问题.他给了我一个8输出,6输出的一个excel表格,前六列是输出后8列是输入.这样我利用matlab将表格导入为'. ...
- Pytorch计算神经网络的参数量和浮点操作数
参考链接:https://github.com/ShichenLiu/CondenseNet/blob/master/utils.py 计算参数量 遍历模型的参数,并提取参数的维度: def get_ ...
- 神经网络参数量的计算:以UNet为例
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:Hello王叔叔 知乎链接:https://zhuanlan.zhihu.c ...
- python/keras中用Grid Search对神经网络超参数进行调参
原文:How to Grid Search Hyperparameters for Deep Learning Models in Python With Keras 作者:Jason Brownle ...
- Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现
二 架构对参数量/计算量的影响 在自建架构的时候,除了模型效果之外,我们还需要关注模型整体的计算效率.深度学习模型天生就需要大量数据进行训练,因此每次训练中的参数量和计算量就格外关键,因此在设计卷积网 ...
- 【深度学习】参数量、模型大小、显存
对于一个深度学习神经网络来说,其通常包含很多卷积层,用于不断提取目标的特征,或对目标进行最终定位或者分类. 1 数据存储精度与存储空间 在深度学习神经网络中,最常见的数据格式是float32,占4个字 ...
- 卷积层和全连接层的区别_CNN卷积层、全连接层的参数量、计算量
我们以VGG-16为例,来探讨一下如何计算卷积层.全连接层的参数量.计算量.为了简单.直观地理解,以下讨论中我们都会忽略偏置项,实践中必须考虑偏置项. [卷积层的参数量] 什么是卷积层的参数? 卷积层 ...
最新文章
- UGC产品的氛围和秩序
- javase总结报告
- python判断、创建文件夹
- WPF DataGrid 主从表 数据绑定方式
- NFS环境搭建测试 保证挂载重启后不丢失
- python实现点击按钮_python实现点击按钮修改数据的方法
- !peb和PEB结构
- 平稳时间序列模型的统计性质
- Vue + Spring Boot 项目实战(一):项目简介
- 利用比值判敛法求收敛半径的问题
- Python黑科技神奇去除马赛克
- 行无疆靠谱讲述拼多多推广方法有哪些?
- 异贝,通过移动互联网技术,为中小微实体企业联盟、线上链接、线上线下自定义营销方案推送。案例62
- 用c语言求五位回文数,C语言求回文数(详解版)
- php文字加边框,图片加特效文字 图片添加各种边框的文字效果 如果有多种边框模板就更好了...
- 手写数字图片数据之python读取保存、二值化、灰度化图片+opencv处理图片的方法
- html玫瑰花,HTML5 canvas绘制的玫瑰花效果
- jQuery 引入和使用
- 聊一聊JAVA指针压缩的实现原理(图文并茂,让你秒懂)
- 【医学影像 | 个人记录】骨盆