• 实验记录:搭建网络过程


    一、遇到的问题

     1.RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

    RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

    当想要测试搭建的网络,看看各个过程的输出形状,随便创建个固定shape的输入如下

    search_var = torch.FloatTensor(1, 3, 255, 255).cuda()

    观察报错的问题,发现是输入 是 torch.cuda.FloatTensor类型的,而 weight是 torch.FloatTensor类型的,所以,需要把 model 放到cuda上才行。

    解决:

    model =model.cuda()

    2.  TypeError: 'PointTarget' object is not iterable

    这个是由于在 设计 points时产生的问题,由于定义类中的

    1. class PointTarget:
    2. def __init__(self):
    3. def __call__(self, target, size, neg=False):

    __init__ 和 __call__ 传入参数冲突引起的,故需要做出改变。 

    而且在利用类时一定要首先初始化实例对象,

    3.debug 时 变量若显示unable to get repr for <class ‘torch.Tensor‘

    分类损失函数,用的focal loss, 所以送入之前数据需要映射到0~1之间,故需要进行一下sigmoid运算 。

    参考这里

    4. RuntimeError: CUDA error: device-side assert triggered

    参考这里

    5 .神经网络的输出出现nan值

    这个可能由于搭建网络结构时,某层的网络的输出没有规一化或者 relu 输出,导致输出值不正常

    6. config.py 与 config.yaml冲突 

    若config.yaml中设置的参数值同时也出现在了config.py文件中的话,一定要确保config.py文件中参数设置的值 与 config.yaml中设置的一致

    7. 分布式训练卡住

    可以设置

    --nproc_per_node=1

    但第二天早上 又  设置成 2又不卡了。 

    二、 实现历程

    1. 搭建自己的网络

    首先根据设计的方法搭建模型,编写代码。 搭建模型的过程中 分部分来完成,即先完成基础的每个部分,然后将它们连接在一起。比如举例来说 分成了 backbone  和 head。

    最后通过创建一个model类来完成模型的前向传播过程,这个会继承pytorch的nn.Module类

    可以随便创建哥输入变量,然后一步一步看看传输过程中特征shape的变化,创建tensor变量的语句如下

    1. template_var = torch.rand((1, 3, 127, 127))
    2. search_var = torch.rand((1, 3, 255, 255))

    2. 设计以及实现损失函数的计算

    搭建完网络结构之后,可以通过model得到想要的输出形式,然后接下来就是损失函数的设计与实现。首先,根据损失函数的需要,先把整个流程确定下来。在这个过程中,涉及到 标签的get,根据想要的输出怎么得到对应的标签呢?标签的shape 一般来说都是与 model 的output shape 相对应的。这里 标签一定要与 得到的预测输出一一对应,与之相联系的就是在进行标签和预测输出进行 permute 和 torch.cat 等等操作时shape变换的对应。

    1. 1) 创建points
    2. 2) 得到标签 cls 和 reg
    3. 3) 组成data 正式训练时构建 dataloader
    4. 4) 搭建模型 model
    5. 5) 数据送入model,得到预测输出

    3. 嵌入模型

    1. 1) 注意data的重新设置。 data中的标签看看是否匹配了
    2. 2) 注意训练时 model 的 forward 过程,是否顺利
    3. 3) 网络中各模块学习率和优化器的设置,注意这方面的解耦

    学习率的设置 是通过字典来设置的,参数 和 lr 键 以及再设置对应的值

    4. 推理过程

    推理过程与训练过程是两个截然不同的部分,一般推理过程和训练过程在同一个tracker类里,不过它们需要分开去定义自己的流程。

  • 相关阅读:
    「PAT乙级真题解析」Basic Level 1098 岩洞施工 (问题分析+完整步骤+伪代码描述+提交通过代码)
    【rust/egui】(十)使用painter绘制一些图形—connections
    pip和conda的环境管理,二者到底应该如何使用
    计算机毕业设计(附源码)python中学网站
    模拟卷Leetcode【普通】061. 旋转链表
    【英语语法】 for
    有问必答|工厂已上信息化系统就等于能够精益生产么?
    OpenCV Series : Slope + Radian + Degree
    2台三菱plc FX5u能否实现无线数据交互?
    两表查询常用SQL
  • 原文地址:https://blog.csdn.net/allrubots/article/details/125792773