关于1个7*7卷积可以由3个3*3卷积替换的错误认知

部署运行你感兴趣的模型镜像

        最近学习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卷积层在参数量上更优,但在计算量上较高,别被有些文章误导了,如果我写的不对,可以提出,我会积极修正,因为我也是小白。

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值