通常,一个神经网络模型的复杂度用2个指标来描述,其一是模型的参数(Parameters)数量,其二是模型的计算量[1]。具体概念的含义如下:
1. Params:模型的参数量。
2. FLOPs:FLoating point OPerations,前向推理的计算量。
3. MAC:Memory Access Cost。
4. MACC(MADD):multiply-accumulate operations:先乘起来再加起来的运算次数。
第一个参数Params评估神经网络模型参数量,后面3个用于评估模型的计算量。
即:
1. 计算量/FLOPS(时间复杂度)即模型的运算次数
2. 访存量/Bytes(空间复杂度)即模型的参数数量
具体计算方法见[2]
我使用的深度学习框架是PyTorch。PyTorch的参数统计与网络结构可使用torchsummary来统计,非常方便[1]。
import torch
import torch.nn as nn
import torchsummary
from torch.nn import init
class BaseNet(nn.Module):
def __init__(self):
super(BaseNet,self).__init__()
self.conv1=nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3,stride=1,padding=1,bias=False)
self.conv2=nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3,stride=1,padding=1,bias=False)
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_uniform_(m.weight.data)
if m.bias is not None:
m.bias.data.zero_()
elif isinstance(m, nn.BatchNorm2d):
init.normal_(m.weight.data, 1.0, 0.02)
init.constant_(m.bias.data, 0.0)
def forward(self,x):
x=self.conv1(x)
out_map=self.conv2(x)
return out_map
def count_parameters(model):
return sum(p.numel() for p in model.parameters() if p.requires_grad)
model = BaseNet()
torchsummary.summary(model.cuda(), (1, 512, 512))
print('parameters_count:', count_parameters(model))
Output:
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 1, 512, 512] 9
Conv2d-2 [-1, 1, 512, 512] 9
================================================================
Total params: 18
Trainable params: 18
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 1.00
Forward/backward pass size (MB): 4.00
Params size (MB): 0.00
Estimated Total Size (MB): 5.00
----------------------------------------------------------------
parameters_count: 18
参考文献:
[1]爽朗:PyTorch几种情况下的参数数量统计
[2]科技猛兽:衡量模型复杂度的指标解读
参考
- ^abchttps://zhuanlan.zhihu.com/p/64425750
- ^abhttps://zhuanlan.zhihu.com/p/266275736