參數(shù)量計(jì)算——
卷積層的參數(shù)數(shù)量就是一個(gè)卷積核的參數(shù)乘上卷積核的個(gè)數(shù)

和
分別表示卷積核的高和寬,一般二者相等,
表示卷積核的厚度,即輸入的通道數(shù);
表示卷積核的個(gè)數(shù),即輸出的通道數(shù)。
最后加上是偏置值的個(gè)數(shù)
layer_num = (math.pow(int(layer.kernel_size[0]),2)*layer.in_channels+1)*layer.out_channels
全連接層的參數(shù)數(shù)量輸入輸出的神經(jīng)元連接的那個(gè)權(quán)重

表示輸入的神經(jīng)元個(gè)數(shù),
表示輸出的神經(jīng)元個(gè)數(shù)。最后加上
是偏置值的個(gè)數(shù)。如果上層是卷積層,
就是上層卷積層的輸出三維矩陣元素個(gè)數(shù),即三個(gè)維度相乘。
layer_num = (layer.in_features+1)*layer.out_features
輸出結(jié)果,不算池化層,AlexNet參數(shù)量約60M,其中最后三層全連接層貢獻(xiàn)了絕大部分參數(shù)量,分別為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
********************
計(jì)算量 FLOPs 計(jì)算——
卷積層的計(jì)算量FLOPs等于參數(shù)量乘以feature_map的大小
對(duì)于某個(gè)卷積層,它的FLOPs數(shù)量為:[(Kh?Kw?Cin)?Cout+Cout]?(H?W)=num_params?(H?W),其中num_paramsnum表示該層參數(shù)的數(shù)目。
以AlexNet網(wǎng)絡(luò)第一卷積層為例,它的FLOPS數(shù)目為:[(11?11?3)?96+96]?(55?55)=105,705,600
全連接層的計(jì)算量FLOPs即是該層參數(shù)數(shù)目
對(duì)于全連接層,由于不存在權(quán)值共享,它的FLOPs數(shù)目即是該層參數(shù)數(shù)目:Nin?Nout+Nout
運(yùn)用上面的規(guī)律,我們便可以很輕松地計(jì)算出AlexNet網(wǎng)絡(luò)的parameters和FLOPs數(shù)目,如下圖:
參數(shù)量計(jì)算詳解


有關(guān)FLOPS的定義與計(jì)算
FLOPS(即“每秒浮點(diǎn)運(yùn)算次數(shù)”,“每秒峰值速度”),是“每秒所執(zhí)行的浮點(diǎn)運(yùn)算次數(shù)”(floating-point operations per second)的縮寫(xiě)。它常被用來(lái)估算電腦的執(zhí)行效能,尤其是在使用到大量浮點(diǎn)運(yùn)算的科學(xué)計(jì)算領(lǐng)域中。正因?yàn)镕LOPS字尾的那個(gè)S,代表秒,而不是復(fù)數(shù),所以不能省略掉。
一個(gè)MFLOPS(megaFLOPS)等于每秒一佰萬(wàn)(=10^6)次的浮點(diǎn)運(yùn)算,
一個(gè)GFLOPS(gigaFLOPS)等于每秒十億(=10^9)次的浮點(diǎn)運(yùn)算,
一個(gè)TFLOPS(teraFLOPS)等于每秒一萬(wàn)億(=10^12)次的浮點(diǎn)運(yùn)算,(1太拉)
一個(gè)PFLOPS(petaFLOPS)等于每秒一千萬(wàn)億(=10^15)次的浮點(diǎn)運(yùn)算,
一個(gè)EFLOPS(exaFLOPS)等于每秒一佰京(=10^18)次的浮點(diǎn)運(yùn)算。
浮點(diǎn)計(jì)算峰值=處理器個(gè)數(shù)×處理器主頻×每秒可進(jìn)行的最高浮點(diǎn)運(yùn)算次數(shù)(FMAD,乘加指令)
CPU主頻和浮點(diǎn)運(yùn)算能力FLOPS的關(guān)系
有很多人認(rèn)為CPU的主頻就是其運(yùn)行速度,其實(shí)不然。CPU的主頻,即CPU內(nèi)核工作的時(shí)鐘頻率(CPU Clock Speed)。CPU的主頻表示在CPU內(nèi)數(shù)字脈沖信號(hào)震蕩的速度,與CPU實(shí)際的運(yùn)算能力并沒(méi)有直接關(guān)系。主頻和實(shí)際的運(yùn)算速度存在一定的關(guān)系,但至今還沒(méi)有一個(gè)確定的公式能夠定量?jī)烧叩臄?shù)值關(guān)系,因?yàn)镃PU的運(yùn)算速度還要看CPU的流水線的各方面的性能指標(biāo)(緩存、指令集、CPU的位數(shù)等等)。
由于主頻并不直接代表運(yùn)算速度,所以在一定情況下,很可能會(huì)出現(xiàn)主頻較高的CPU實(shí)際運(yùn)算速度較低的現(xiàn)象。比如AMD公司的AthlonXP系列CPU大多都能以較低的主頻,達(dá)到英特爾公司的Pentium 4系列CPU較高主頻的CPU性能,所以AthlonXP系列CPU才以PR值的方式來(lái)命名。因此主頻僅是CPU性能表現(xiàn)的一個(gè)方面,而不代表CPU的整體性能。CPU的主頻不代表CPU的速度,但提高主頻對(duì)于提高CPU運(yùn)算速度卻是至關(guān)重要的。
矩陣乘法的浮點(diǎn)運(yùn)算次數(shù)如何計(jì)算
假設(shè)有m * n的矩陣A, 和n * o的矩陣B, 則最終會(huì)形成m * o的矩陣C (C = A * B)
其中n是A的寬度, 也是B的高度.
最終總的運(yùn)算量需要m * o * n次乘加.
將1次乘加看成兩次運(yùn)算(一次乘法, 一次加法),
則最終需要 2 * m * o * n次運(yùn)算, 這是總的浮點(diǎn)數(shù)運(yùn)算量
