假设input的size为 3 x 64 x 64, output : 4 x 64 x 64.
常规卷积
深度可分离卷积
量化对比
- 参数量
传统卷积:d x d x C_in x C_out ;
深度可分离卷积 :d x d x C_in + C_out x 1 x 1 x C_in ;
参数比[深度可分离:传统]:(d x d + C_out) / (d x d x C_out) ≈ 1 / (d x d) 【if C_out >> d x d】 ;
- 计算量
传统卷积:d x d x C_in x C_out x H x W ;
深度可分离卷积:d x d x C_in x H x W + C_out x 1 x 1 x C_in x H x W ;
运算量比[深度可分离:传统] : (d x d + C_out) / (d x d x C_out) = 1 / C_out + 1 / (d x d) ≈ 1 / (d x d) 【if C_out >> d x d】
Pytorch
- 常规卷积
nn.Conv2d(inplanes, planes, kernel_size=3, stride, 1, bias=False)
nn.BatchNorm2d(planes)
nn.PReLU(planes)
- 深度可分离卷积
nn.Conv2d(inplanes, planes, kernel_size=3, stride, 1, groups=planes, bias=False)
# groups的取值应为inplanes、planes的公约数,即能够被inplanes、planes同时整除
# inplanes/groups表示每个group中channel的个数;
# planes/groups表示group中channel被使用几次;
nn.BatchNorm2d(planes)
nn.PReLU(planes)
nn.Conv2d(planes, planes, 1, 1, 0, bias=False)