初入深度学习4——如何修改一个深度学习库
- 学习前言
- 深度学习库的组成
- 修改目标定位
- 举例
-
- 一、任务介绍
- 二、目标定位
- 三、变量分析
- 四、修改代码
- 总结
学习前言 在学习过一个深度学习库之后,如果想要满足自己项目或者论文的不同需求,大多数需要对仓库及进行修改,此时如何定位修改的位置,并且对变量进行分析修改,就显得非常重要。
文章图片
深度学习库的组成 通过《初入深度学习3——如何分解与学习一个深度学习库》我们已经了解到,一个深度学习仓库具有不同的组成,我们可以将一个深度学习仓库分解如下:
深度学习库的功能通常包括两个部分,一部分是训练模型,另一部分是利用模型进行预测。
在训练模型时,需要考虑模型本身,训练参数,数据加载与损失函数。
在预测模型时,需要考虑模型本身,数据加载,预测后处理。
修改目标定位 在修改仓库前,需要根据所需要修改的功能对需要修改的目标进行定位,比如:
想要对网络结构进行改进,那么就定位到模型本身,然后修改网络结构的特定部分。
想要对训练参数进行改进,那么就定位到训练参数,然后查找各个参数的作用,进一步进行修改。
想要对数据增强进行改进,那么就定位到数据加载,然后分解其中数据增强的部分,修改数据增强的过程。
想要对损失函数进行改进,那么就定位到损失函数,然后分解其中的回归部分、分类部分等,进一步对细节进行修改。
想要对预测结果进行改进,那么就定位到预测后处理,然后根据自身需求,分解每个输出的作用,进一步修改。
因此,在修改前需要做到:
定位修改目标与分析相关变量。
举例 一、任务介绍 【初入深度学习|初入深度学习4——如何修改一个深度学习库】接下来,本文将对目标检测算法进行修改,对检测到的对象进行计数。
这个计数的过程实现非常简单,但询问的人却蛮多的,简单看看如何实现。
二、目标定位 首先需要对计数这个任务进行分析,分析结果如下:
计数与模型本身并没有什么关系。
预测前我们不能进行计数。
计数和训练没什么关系。
计数发生在预测之后。
因此计数是属于预测后处理的内容。我们首先定位到预测的后处理部分。
本文以使用较多的YoloV3-Pytorch库为例,进行解析。定位到YoloV3-Pytorch库的预测的后处理部分,下面的截图中,包括了预测部分与预测后处理的部分。预测后就是预测后处理的部分了。
文章图片
三、变量分析 对预测结果进行分析,网络self.net的输出是outputs,outputs解码后仍赋给了outputs。这两行过后,outputs是预测结果解码后的内容。
文章图片
下一步是进行非极大抑制,结果赋给了results,因此results是非极大抑制后的结果。
文章图片
下一步对非极大抑制后的结果进行分解,获得标签,置信度,和预测框坐标。
文章图片
在这里,我们已经定位到我们需要的变量了,就是这个top_label,由于top_label代表的是所有预测框的标签,那么我们只需要根据标签进行计数即可。
四、修改代码 既然要使用到top_label,那么首先先打印一下top_label是个什么。
文章图片
文章图片
打印出来可知,top_label就是一个长条矩阵罢了,里面是每个预测框的标签种类。
由于要进行计数,我们需要判断每个预测框属于哪个类,在python中,利用矩阵可以进行整体的判断,因此我们对self.class_names进行循环,然后判断top_label等于每个类的数量即可。
类别较多时,会将许多无关的类显示出来,因此多增加一个if sub_label_num > 0:的条件判断,只显示有数量的类别。
for i in range(len(self.class_names)):
sub_label_num = np.sum(top_label == i)
if sub_label_num > 0:
print(self.class_names[i], sub_label_num)
之后就可以正常计数了。
总结 代码的修改有易有难,本文举了一个较为简单的例子,但修改的思路却是不变的,首先定位修改目标,然后进行变量分析,最后修改代码即可。
最大的不变就是变化,需求时时刻刻都是在变化的,自己会修改代码,未来的路也会宽的多。
推荐阅读
- 初入深度学习|初入深度学习2——如何使用一个深度学习库
- 初入深度学习|初入深度学习3——如何分解与学习一个深度学习库
- 分布式|手把手推导分布式矩阵乘的最优并行策略
- c++|拯救工程师,远程开发C++的四大秘笈|视频教程
- 业界观点|最优的纯文本模型(GPT-4蓄势待发)
- 社区之星|刘馨蔓(“她是行走的发光体”|OneFlow U)
- 人工智能|OneFlow最新版本登陆矩池云,快来体验吧
- 业界观点|深度学习六十年简史
- 前沿技术|手把手推导Back Propagation