Pytorch---空间特征金字塔SPP模块的实现

news2024/9/28 9:23:47

文章目录

  • 一、SPP模块
  • 二、使用pytorch实现



一、SPP模块

SPP模块是指定空间特征金字塔模块,是由何凯明在2014年的论文中所提出的。
论文地址如下:
论文地址

该模块的主要作用是:在分类网络中,通过分类器之后,与全连接层连接时,全连接层的形状是固定的,所以必须将输入网络的图片resize成224224,否则当数据传输到全连接层时,权重不匹配,会发生错误。而将所以图片都resize成224224,可能会使图片失真等等。因此SPP模块提出的作用就是,将分类器最后的pooling层变成SPP模块,这样网络可以接受任意尺寸的输入,不需要将输入图片resize成224*224。
SPP模块的结构如下:
在这里插入图片描述
主要理解论文中这句话即可:
These spatial bins have sizes proportional to the image size, so the number of bins is fixed regardless of the image size.
翻译:这些空间箱的大小与图像大小成正比,因此无论图像大小如何,箱的数量都是固定的。
池化窗口的大小和步长都是跟随输入的h和w所变化的,所导致的结果就是,池化之后的h和w一定是4乘以4,2乘以2,1乘以1。
箱指的是小网格

整个的流程如下:
1: 经过分类器的feature map 的尺寸是channel h w(忽略batch)
2: 首先经过第一个最大池化,得到的结果是44大小的,然后经过第二个最大池化,得到的结果是22大小的, 然后经过第三个最大池化,得到的结果是1*1大小的。然后将其展平,拼接起来,就会得到21列的向量。
不论输入的图像尺寸为多少,最后在全连接层之前feature map都会都会变成256 乘以 21大小,其中256是channel。

二、使用pytorch实现

实际上关键就是,动态的求解出池化窗口的k和s大小
在这里插入图片描述

class SPP(torch.nn.Module):
    def __init__(self, input):
        super(SPP, self).__init__()
        self.pool_param = [(4, 4), (2, 2), (1, 1)]

        # 假设h和w相等,不相等的情况,h和w单独处理即可
        h = input.shape[2]
        w = input.shape[3]
        s1 = h // self.pool_param[0][0]
        k1 = h - s1 * (self.pool_param[0][0] - 1)
        self.pool_4_4 = torch.nn.MaxPool2d(kernel_size=(k1, k1), stride=(s1, s1))

        s2 = h // self.pool_param[1][0]
        k2 = h - s2 * (self.pool_param[1][0] - 1)
        self.pool_2_2 = torch.nn.MaxPool2d(kernel_size=(k2, k2), stride=(s2, s2))

        s3 = h // self.pool_param[2][0]
        k3 = h - s2 * (self.pool_param[2][0] - 1)
        self.pool_1_1 = torch.nn.MaxPool2d(kernel_size=(k3, k3), stride=(s3, s3))

    def forward(self, x):
        x1 = self.pool_4_4(x)
        x1 = torch.flatten(x1, start_dim=-2, end_dim=-1)
        x2 = self.pool_2_2(x)
        x2 = torch.flatten(x2, start_dim=-2, end_dim=-1)
        x3 = self.pool_1_1(x)
        x3 = torch.flatten(x3, start_dim=-2, end_dim=-1)
        x = torch.cat((x1, x2, x3), dim=-1)
        return x
 if __name__ == "__main__":
    vgg_model = vgg16_bn(weights = VGG16_BN_Weights.DEFAULT)
    # print(vgg_model)
    # print(list(vgg_model.features.children()))
    test = torch.rand(8, 3, 16, 16)
    model = SPP(test)
    output = model(test)
    print(output.shape)

输入为(8,3,16,16),经过SPP模块之后,大小为
在这里插入图片描述
这里16,16刚好是4,2,1的整数倍,更换其他数字
输入为(8,3,15,15),经过SPP模块之后,大小为在这里插入图片描述
可以再尝试其他数字,只要大于等于4,得到的尺寸都是统一的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stack与queue的简单封装

前言: stack与queue即栈和队列,先进后出/先进先出的特性我们早已了然于心, 在学习数据结构时,我们利用c语言实现栈与队列,从结构体写起,利用数组或指针表示他们的数据成员,之后再一个个实现他们…

Linux 故障定位手段之保存某个时间段内的top结果

在Linux中对故障原因进行定位时,除了查看对应的软体运行日志、OS运行日之外,还可以查看 top 的资源消耗结果。 参考语句: 以CPU为基准列进行排序记录TOP结果 nohup top -d 1 -b -o %CPU | tee -a /tmp/cpu.txt & 语句含义:每…

etc目录下的profile.d文件目录设置环境变量和全局脚本

一、设置环境变量 etc目录下的profile.d文件目录 /etc/profile.d 1、编写 vi test.sh文件内容 # jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile …

34.CSS魔线图标的悬停效果

效果 源码 index.html <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Icon Fill Hover Effects</title> <link rel="stylesheet" h…

【深度学习实验】前馈神经网络(final):final

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;IrisDataset&#xff09; 2. 构建模型&#xff08;FeedForward&#xff09; a. __init__(初始化) b. forward(前向传播) 3.整合训练、评估…

Mojo:新型AI语言中的7个令人惊叹的Python升级,用简单的英语解释人工智能

Mojo&#xff1a;新型AI语言中的7个令人惊叹的Python升级 编程之美 用简单的英语解释人工智能 编程之美 由Coding Beauty设计的图像&#xff0c;使用Mojo标志和Python标志。 它比C更快&#xff0c;与Python一样简单&#xff0c;但速度提高了35000倍。 进入Mojo&#xff1a;一种…

冒泡排序与选择排序(最low的两兄弟)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 在我们的生活中&#xff0c;无处不在用到排序&#xff0c;比如说成绩的排名&#xff0c;淘宝&#xff0c;京东等等商品在各个方面的排序&#xff0c;这样看来一个好的算 法很重要&#xff0c;接下来我们要先…

深度学习自学笔记四:浅层神经网络(一)

一、神经网络概述 神经网络是一种模仿人脑神经系统结构和功能的计算模型。它由大量相互连接的人工神经元组成&#xff0c;并通过这些神经元之间的信息传递来进行计算和学习。 神经网络的基本组成单元是神经元&#xff0c;也称为节点或单元。每个神经元接收来自其他神经元的输…

第一百五十二回 自定义组件综合实例:游戏摇杆三

文章目录 内容回顾优化性能示例代码我们在上一章回中介绍了 如何实现游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在前面章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的整个过程…

取消github向邮箱推送邮件及修改密码

取消或者说禁止github向邮箱推送邮件&#xff0c;因为量太大了&#xff0c;没多久就上万封邮件&#xff0c;于是取消订阅或者推送。 1、登录github 2、点击右上角头像&#xff0c;然后点击Settings 3、点击Notifications&#xff08;通知&#xff09; 4、取消各种推送&#x…

SpringBoot开发实战(微课视频版)

ISBN: 978-7-302-52819-7 编著&#xff1a;吴胜 页数&#xff1a;311页 阅读时间&#xff1a;2023-06-24 推荐指数&#xff1a;★★★★☆ 本文介绍SpringBoot 2.0.5 、JDK 1.8&#xff0c;虽然现在已经不维护了&#xff0c;但是大体的流程还是对口的&#xff0c; 而且书里面讲…

新手学习:ArcGIS对shp文件裁剪

新手学习&#xff1a;ArcGIS对SHP文件裁剪 新手学习 记录每个步骤&#xff0c;因为有很多控件可能刚开始还不熟悉&#xff0c;根本不知道在哪里&#xff0c;所以写的比较详细。 1.添加要裁剪的shp文件 2.查看shp文件的地理坐标系 双击shp文件&#xff0c;就可以查看shp文件的…

LeetCode【174. 地下城游戏】

一片丹心图报国&#xff0c;两行清泪为忠家。——于谦 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康…

【Linux】系统编程基于环形队列生产者消费者模型(C++)

目录 【1】引入POSIX信号量 【1.1】初始化信号量 【1.2】销毁信号量 【1.3】等待信号量 【1.4】发布信号量 【2】基于环形队列的生产消费模型 【2.1】生产消费模型打印数字模型 【2.2】生产消费模型计算公式模型 【2.3】生产消费模型计算公式加保存任务模型 【1】引入…

###Data Structure###考研重点

顺序表 顺序表 &#xff08;此代码i是序号而非角标&#xff09; 结构体&#xff1a; 插入&#xff1a;从最后一个元素逐个往后移一位 删除&#xff1a;从删除位置的下一个把每个提前一位 顺序&#xff08;循环&#xff09;队列 结构体 判断队满 &#xff08;总结&#xff…

Dependency ‘org.redisson:redisson:‘ not found解决方法 三种刷新Maven项目的方法

报错情况 在pom中导入redisson包 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId> </dependency> 爆红&#xff0c;还显示Dependency org.redisson:redisson: not found。 由于报错已经解决&#xff0c;…

postgresql-触发器

postgresql-触发器 触发器概述创建触发器管理触发器删除触发器事件触发器创建事件触发器修改触发器删除事件触发器 触发器概述 PostgreSQL 触发器&#xff08;trigger&#xff09;是一种特殊的函数&#xff0c;当某个数据变更事件&#xff08;INSERT、UPDATE、 DELETE 或者 TR…

6 年大厂程序员跟你聊聊,算法其实没那么难,要怎么准备比较好

说起算法&#xff0c;许多程序员都会一顿哀嚎&#xff0c;为啥面试要靠算法这个东西。不过这个不是咱们讨论的重点。&#xff08;我们无法改变这种现状&#xff0c;那就改变自己&#xff09; 今天&#xff0c;我们一起来聊一下&#xff0c;程序员面试的时候该如何准备算法。 …

数字图像基础,数字图像处理中的基础内容(数字图像处理概念 P2)

文章目录 人类视觉系统构造数字图像生成采样和量化像素之间的基本关系 人类视觉系统构造 锥状体&#xff1a;明亮的视野杆状体&#xff1a;微光或暗视野图像成像原理&#xff1a;类似照相机亮度适应现象&#xff1a;人的视觉不能同时在一个范围内工作同时对比现象&#xff1a;…

怒刷LeetCode的第14天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;栈 方法三&#xff1a;双指针 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;二分查找 方法二&#xff1a;线性扫描 方法三&#xff1a;递归 第三题 题目来源 …