IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 模型修改之替换骨干网络(backbone) -> 正文阅读

[人工智能]模型修改之替换骨干网络(backbone)

前言

说实话这篇文章是没有在计划之内的,但是有读者说让我出一个使用transformer替换其他骨干网络的示例,想了想,最近好像没啥状态的,论文有点看不下去,正好整理一下自己的经验把。说实话替换骨干网络说简单也简单,说麻烦也麻烦,替换骨干网络个人感觉就是一个debug代码匹配输入输出的问题,作为菜鸡的一种能想到的改进模型方式之一,替换骨干网络也不失为一种锻炼自己看懂代码、改代码的能力,废话就到这里,下面开始文章的内容。

替换骨干网络的原则

为什么一些模型能够把其内部的模块进行替换?理由很简单,就是把里面的模块看作一个黑盒子,黑盒子有着输入和输出,那么作为网络中的一个部分,前面有着输入过来,后面也需要输出到其他模块,要想替换该模块而让模型能够运行起来,关键是输入输出的匹配问题,下面就以我自己实验过模型作为例子。
我要替换的骨干网络是3D目标检测的一个方法叫Group-Free 3d,它使用的骨干网络是PointNet++,就是下面的图中用红色框框出来的部分。
在这里插入图片描述
而我想用一个transformer的骨干网络Pointformer替换掉PointNet++。首先这里我说一下为什么我想用Pointformer来替换PointNet++,因为在Pointformer这个论文中,它说Pointformer这个骨干网络可以替换PointNet++来获得更好的性能,我观察到Group-Free 3d中使用的是PointNet++作为骨干网络,但是没有人将其中的PointNet++换为Pointformer,所以我想把Pointformer替换PointNet++看能否提高Group-Free 3d的性能。**所以,在这里强调一下,我所替换的骨干网络是别人的方法所使用过的,但是在新的模型中没有实践过的。**但是我觉得原理都是一样的,就是把输入和输出匹配对应上就可以了。

过程

查看网络参数的设置

首先根据Pointformer论文的介绍,Pointforemer是不用经过修改就可以直接替换PointNet++的,但是不保证有人用PointNet++的时候会进行一些输入输出层数的修改,所以这里就需要查看输入和输出层的网络设置。就比如我这次的实验就中用到的Group-Free 3d中PointNet++的最后一层输出大小为288,而一般的都是输出256,如下图所示:
在这里插入图片描述

因此要更改输出256为288。如果说自己使用的代码中没有像这么规范的形式把输入和输出都集中在一个文件上的,可以直接从骨干网络的代码里面找第一层网络的数据输入要求和最后一层的网络的输出数据格式进行修改。
比如:
输入:
在这里插入图片描述
这里的真正的开始对数据进行处理的是下面的那个红色的框,这个时候就可以根据self.sa1()这个函数所涉及的输入以及其网络的参数进行查看了。
在这里插入图片描述

输出:
在这里插入图片描述
骨干网络的最后的一层网络是self.fp2()这个函数,同样的可以去找到它的网络参数设计:
在这里插入图片描述
修改完之后就可以替换骨干网络了:
在这里插入图片描述

查看输入输出是否匹配

修改完设置之后就可以进行骨干网络的替换了,替换后先查看替换后的骨干网络(Pointfomer)在新的模型中的输入输出是否与原始的骨干网络(PointNet++)的输入输出对应。首先查看原始方法中的骨干网络的输入输出是多少,这时就要用到debug模式了,如下图,PointNet++的输入为:
在这里插入图片描述
注意是要在forward函数里面查看输入的大小,比如这里PointNet++的输入大小为torch.Size([6, 20000, 4]),格式为(batch_size, 点云数目,点云的向量长度),记住这个输入的大小,替换为Pointformer的时候也要让Pointformer能够接受这个大小的数据。
接下来查看PointNet++的输出,直接拉到forward函数的返回语句下面,然后同样的设置断点打印输出包含的东西以及大小
在这里插入图片描述
抓住主要输出,主要关注在骨干网络输出后下一模块需要哪些输出,比如这里有三个输出集合在一个字典里面,再看看骨干网络之后的模块的输入也是需要这三个输出,如下图所示:
在这里插入图片描述
这里的骨干网络的输出为:

torch.Size([6, 288, 1024])
torch.Size([6, 1024, 3])
torch.Size([6, 1024])

同样的记住这三个数据的大小,在替换为Pointformer之后查看Pointformer的输出是不是与这些数据的大小相匹配。

总结

首先要记住的原则是,替换的骨干网络和原始的骨干网络有着相同大小的数据输入输出。然后是查看骨干网络第一层的数据输入大小和骨干网络最后一层的输出大小,对参数进行修改,修改完之后参数后进行骨干网络的替换,然后查看网络的输入输出是否与原始骨干网络的输入输出相匹配。中间涉及到很多细节,每个人遇到的问题都不一样,本篇文章旨在原理和一些经验的说明,不可能详细到每个细节,总之一句话就是记录输入输出,然后进行修改,多debug就行了
至于替换后的效果怎么样,老实说,这个是个玄学,涉及到很多东西,也许是你的学习率不够好,连替换之前的方法的精度都不如。也有可能是你加进去的模块和后面的模块有着冲突导致性能的下降,等等等。。。。

结束语

这东西做多了就自然而然的会了,不会就百度博客教程什么的。
本人水平有限,如有错误之处,敬请指出。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章           查看所有文章
加:2022-06-25 18:06:59  更:2022-06-25 18:10:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:54:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码