网络参数和flops计算

@TOC

网络参数计算

1. 卷积层

假设输入维度为m,输出维度为n,卷积核大小为(k, k)

  • bias=True: 一个卷积核含有的参数为,有n个卷积核,所以总参数为
  • bias=False: 没有bias时,不需要加上最后的n,总参数为

nn.Conv2d(3, 20, (3, 3), stride=1, padding=1)

bias默认为True

上述参数为,如果设置bias=False就是540

2. 线性层

假设输入维度为m,输出维度为n

  • bias=True: 输入为m,输出为n,参数为
  • bias=False: 没有bias时,不需要加上最后的n,总参数为

nn.Linear(3, 20, bias=True)

bias默认为True

上述参数为,如果设置bias=False就是60

3. 归一化层

假设输入维度为m

  • affine=True: 有两个可学习的参数,参数2m
  • affine=False: 没有参数,0

nn.BatchNorm2d(20, affine=True)

affine默认为True

上述参数为,如果affine=False为0

Flops

Flops的运算为:一次乘加运算为一次Flops

1. 卷积层

假设输入维度为m,输出维度为n,卷积核大小为(k, k),输出特征图的尺寸为(H,W)

一个卷积核每进行一次卷积所需要乘法是,加法,所以一个卷积核的计算量为(忽略掉那-1的运算,乘加就相等了),输出的特征图为HW,输出channel为n,所以总共的Flops为:

2. 线性层

假设输入维度为m,输出维度为n,batch为b

从下图可以看出b=128,我们先不管这个参数,他的每一个数据m=20,n=30,b中的每一个数据都需要计算m次乘法,计算完之后如果有bias需要额外计算m次加法,输出维度为n,所以一共需要计算mn次乘法和mn次加法,即Flops:,算上batch为

3. 归一化

假设输出维度为m,Batch为b

归一化层有可学习的参数,各有m次乘加操作,所以Flops:,算上batch为

计算的模块

torchsummary模块

pip install torchsummary

1
2
from torchsummary import summary
summary(model, (3, 224, 224))

flops_counter模块

GitHub地址:https://github.com/sovrasov/flops-counter.pytorch

pip install ptflops

1
2
from ptflops import get_model_complexity_info
flops, params = get_model_complexity_info(model, (3, 224, 224), as_strings=True, print_per_layer_stat=True)
Error: API rate limit exceeded for 35.174.118.81. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)