最近学习yolov2的过程中了解到了1个7*7卷积可以由3个3*3卷积替换的操作,视频教学中只提及了3个3*3卷积替换1个7*7卷积可以减少模型的参数量,但是引起了我的思考,那计算量呢?
经过手动计算,我发现3个3*3卷积替换1个7*7卷积计算量会提升,并且通过代码计算后发现确实如此,但是查询优快云的结果却发现一些帖子在误导大众,说3个3*3卷积的参数量和计算量都少于1个7*7卷积。
以下是代码验证部分,由ai生成,但计算结果和我手动计算一致,图片尺寸为(1,3,7,7),即1张3通道的7*7图像分别经过3个3*3卷积和1个7*7卷积处理后可以得到所需的参数量和计算量:
import torch
import torch.nn as nn
# 定义7x7卷积层
conv7x7 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=7, stride=1, padding=0)
# 定义三个3x3卷积层
conv3x3_1 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=1, padding=0)
conv3x3_2 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=1, padding=0)
conv3x3_3 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, stride=1, padding=0)
# 计算参数量
params_7x7 = sum(p.numel() for p in conv7x7.parameters())
params_3x3 = sum(p.numel() for p in conv3x3_1.parameters()) + \
sum(p.numel() for p in conv3x3_2.parameters()) + \
sum(p.numel() for p in conv3x3_3.parameters())
print(f"7x7卷积层的参数量: {params_7x7}")
print(f"三个3x3卷积层的参数量: {params_3x3}")
# 计算计算量
input_tensor = torch.randn(1, 3, 7, 7)
# 7x7卷积层的计算量
output_7x7 = conv7x7(input_tensor)
flops_7x7 = output_7x7.numel() * 7 * 7 * 3
# 三个3x3卷积层的计算量
output_3x3_1 = conv3x3_1(input_tensor)
output_3x3_2 = conv3x3_2(output_3x3_1)
output_3x3_3 = conv3x3_3(output_3x3_2)
flops_3x3 = output_3x3_1.numel() * 3 * 3 * 3 + \
output_3x3_2.numel() * 3 * 3 * 3 + \
output_3x3_3.numel() * 3 * 3 * 3
print(f"7x7卷积层的计算量: {flops_7x7}")
print(f"三个3x3卷积层的计算量: {flops_3x3}")
得到输出结果:
7x7卷积层的参数量: 444
三个3x3卷积层的参数量: 252
7x7卷积层的计算量: 441
三个3x3卷积层的计算量: 2835
以下是计算过程:
参数量=卷积核参数+偏置参数
1个 7*7 卷积层参数量
(7×7×3×3)+3=441+3=444
所以,7x7 卷积层的参数量是 444。
3 个 3x3 卷积层参数量
因为有 3 个这样的卷积层,且 in_channels = 3,out_channels = 3,那么总参数量为:
3×(3×3×3×3+3)=3×(81+3)=3×84=252
所以,3 个 3x3 卷积层的参数量是 252。
计算量=卷积核尺寸*输入通道数*输出通道数*输出特征图尺寸
7x7 卷积层计算量
对于 7x7 卷积,输入图像尺寸是 7x7,卷积核大小为 7x7,不进行填充(padding = 0),输出特征图尺寸为 1x1,得到:
7×7×3×3×1×1=441
所以,7x7 卷积层的计算量是 441。
3 个 3x3 卷积层计算量
第一个 3x3 卷积层:输入图像尺寸为 7x7,卷积核大小为 3x3,不填充(padding = 0),输出特征图尺寸为 5x5。其计算量为:
3×3×3×3×5×5=2025
第二个 3x3 卷积层:输入特征图尺寸为 5x5,卷积核大小为 3x3,不填充,输出特征图尺寸为 3x3。其计算量为:
3×3×3×3×3×3=729
第三个 3x3 卷积层:输入特征图尺寸为 3x3,卷积核大小为 3x3,不填充,输出特征图尺寸为 1x1。其计算量为:
3×3×3×3×1×1=81
三个卷积层的总计算量为:
2025+729+81=2835
所以说3个3x3卷积层在参数量上更优,但在计算量上较高,别被有些文章误导了,如果我写的不对,可以提出,我会积极修正,因为我也是小白。