参数量计算——
卷积层的参数数量就是一个卷积核的参数乘上卷积核的个数
和分别表示卷积核的高和宽,一般二者相等,表示卷积核的厚度,即输入的通道数;表示卷积核的个数,即输出的通道数。
最后加上是偏置值的个数
layer_num = (math.pow(int(layer.kernel_size[0]),2)*layer.in_channels+1)*layer.out_channels
全连接层的参数数量输入输出的神经元连接的那个权重
表示输入的神经元个数,表示输出的神经元个数。最后加上是偏置值的个数。如果上层是卷积层,就是上层卷积层的输出三维矩阵元素个数,即三个维度相乘。
layer_num = (layer.in_features+1)*layer.out_features
输出结果,不算池化层,AlexNet参数量约60M,其中最后三层全连接层贡献了绝大部分参数量,分别为36M、16M、4M,共56M
********************
Conv2d(3, 96, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))
layer[0] has 34944.0 / 34.125K / 0.0333251953125M params
Conv2d(96, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
layer[2] has 614656.0 / 600.25K / 0.586181640625M params
Conv2d(256, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
layer[4] has 885120.0 / 864.375K / 0.8441162109375M params
Conv2d(384, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
layer[5] has 1327488.0 / 1296.375K / 1.2659912109375M params
Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
layer[6] has 884992.0 / 864.25K / 0.843994140625M params
Linear(in_features=9216, out_features=4096, bias=True)
layer[8] has 37752832 / 36868.0K / 36.00390625M params
Linear(in_features=4096, out_features=4096, bias=True)
layer[9] has 16781312 / 16388.0K / 16.00390625M params
Linear(in_features=4096, out_features=1000, bias=True)
layer[10] has 4097000 / 4000.9765625K / 3.9072036743164062M params
alexnet has 62378344.0 / 60916.3515625K / 59.488624572753906M params need to train
********************
计算量 FLOPs 计算——
卷积层的计算量FLOPs等于参数量乘以feature_map的大小
对于某个卷积层,它的FLOPs数量为:[(Kh∗Kw∗Cin)∗Cout+Cout]∗(H∗W)=num_params∗(H∗W),其中num_paramsnum表示该层参数的数目。
以AlexNet网络第一卷积层为例,它的FLOPS数目为:[(11∗11∗3)∗96+96]∗(55∗55)=105,705,600
全连接层的计算量FLOPs即是该层参数数目
对于全连接层,由于不存在权值共享,它的FLOPs数目即是该层参数数目:Nin∗Nout+Nout
运用上面的规律,我们便可以很轻松地计算出AlexNet网络的parameters和FLOPs数目,如下图:
参数量计算详解
有关FLOPS的定义与计算
FLOPS(即“每秒浮点运算次数”,“每秒峰值速度”),是“每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。
一个MFLOPS(megaFLOPS)等于每秒一佰万(=10^6)次的浮点运算,
一个GFLOPS(gigaFLOPS)等于每秒十亿(=10^9)次的浮点运算,
一个TFLOPS(teraFLOPS)等于每秒一万亿(=10^12)次的浮点运算,(1太拉)
一个PFLOPS(petaFLOPS)等于每秒一千万亿(=10^15)次的浮点运算,
一个EFLOPS(exaFLOPS)等于每秒一佰京(=10^18)次的浮点运算。
浮点计算峰值=处理器个数×处理器主频×每秒可进行的最高浮点运算次数(FMAD,乘加指令)
有很多人认为CPU的主频就是其运行速度,其实不然。CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。CPU的主频表示在CPU内数字脉冲信号震荡的速度,与CPU实际的运算能力并没有直接关系。主频和实际的运算速度存在一定的关系,但至今还没有一个确定的公式能够定量两者的数值关系,因为CPU的运算速度还要看CPU的流水线的各方面的性能指标(缓存、指令集、CPU的位数等等)。
由于主频并不直接代表运算速度,所以在一定情况下,很可能会出现主频较高的CPU实际运算速度较低的现象。比如AMD公司的AthlonXP系列CPU大多都能以较低的主频,达到英特尔公司的Pentium 4系列CPU较高主频的CPU性能,所以AthlonXP系列CPU才以PR值的方式来命名。因此主频仅是CPU性能表现的一个方面,而不代表CPU的整体性能。CPU的主频不代表CPU的速度,但提高主频对于提高CPU运算速度却是至关重要的。
假设有m * n的矩阵A, 和n * o的矩阵B, 则最终会形成m * o的矩阵C (C = A * B)
其中n是A的宽度, 也是B的高度.
最终总的运算量需要m * o * n次乘加.
将1次乘加看成两次运算(一次乘法, 一次加法),
则最终需要 2 * m * o * n次运算, 这是总的浮点数运算量