@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 | from torchsummary import summary |
flops_counter模块
GitHub地址:https://github.com/sovrasov/flops-counter.pytorch
pip install ptflops
1 | from ptflops import get_model_complexity_info |