SPP和SPPF的比较

SPP的结构是将输入并行通过多个不同大小的MaxPool层,然后做进一步融合,能在一定程度上解决多尺度问题。

而SPPF结构则是讲输入串行通过多个5*5的MaxPool层,这里需要注意两个5*5的MaxPool层和一个9*9的MaxPool的计算结果是一样的,而串行三个5*5的MaxPool层和一个13*13的MaxPool层计算结果是一样的。

做个实验对比一下:

复制代码
import time
import torch
import torch.nn as nn

class SPP(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)
    
class SPPF(nn.Module):
    def __init__(self):
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)
    
def main():
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"spp time : {time.time()- t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"sppf time : {time.time()- t_start}")

if __name__== '__main__':
    main()

最终输出为:

通过对比发现,两者的计算结果是一模一样的,但是计算时间SPPF比SPP快乐两倍多。

相关推荐
快乐非自愿几秒前
AI低代码与智改数转:破除伪命题,重构技术落地逻辑
人工智能·低代码·重构
新加坡内哥谈技术7 分钟前
大型语言模型与软件开发职业
人工智能
大厂技术总监下海7 分钟前
为Claude注入“执行力”:Awesome Claude Skills——打开AI助手的开关矩阵
人工智能·数据分析·开源
一个帅气昵称啊9 分钟前
基于 .NET 的 AI 流式输出实现AgentFramework+SignalR
人工智能·.net
Allen_LVyingbo13 分钟前
构建医疗AI数据集建设平台:Go语言工程方案详解
开发语言·人工智能·自然语言处理·golang·知识图谱·健康医疗
qyr678913 分钟前
全球无人机市场发展趋势分析
大数据·人工智能·无人机·市场分析·市场报告
CCPC不拿奖不改名14 分钟前
Git 核心操作命令
人工智能·git·python·rnn·自然语言处理·josn
testpassportcn15 分钟前
AWS AIF-C01 認證介紹|AWS Certified AI Foundations 全面解析
人工智能
shangjian00716 分钟前
AI大模型-卷积神经网络-卷积核的由来
人工智能·神经网络·cnn