当前位置:网站首页>实验记录:搭建网络过程
实验记录:搭建网络过程
2022-08-09 11:32:00 【匿名的魔术师】
一、遇到的问题
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时产生的问题,由于定义类中的
class PointTarget:
def __init__(self):
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变量的语句如下
template_var = torch.rand((1, 3, 127, 127))
search_var = torch.rand((1, 3, 255, 255))
2. 设计以及实现损失函数的计算
搭建完网络结构之后,可以通过model得到想要的输出形式,然后接下来就是损失函数的设计与实现。首先,根据损失函数的需要,先把整个流程确定下来。在这个过程中,涉及到 标签的get,根据想要的输出怎么得到对应的标签呢?标签的shape 一般来说都是与 model 的output shape 相对应的。这里 标签一定要与 得到的预测输出一一对应,与之相联系的就是在进行标签和预测输出进行 permute 和 torch.cat 等等操作时shape变换的对应。
1) 创建points
2) 得到标签 cls 和 reg
3) 组成data 正式训练时构建 dataloader
4) 搭建模型 model
5) 数据送入model,得到预测输出
3. 嵌入模型
1) 注意data的重新设置。 data中的标签看看是否匹配了
2) 注意训练时 model 的 forward 过程,是否顺利
3) 网络中各模块学习率和优化器的设置,注意这方面的解耦
学习率的设置 是通过字典来设置的,参数 和 lr 键 以及再设置对应的值
trainable_params += [{'params': filter(lambda x: x.requires_grad,
model.backbone.parameters()),
'lr': cfg.BACKBONE.LAYERS_LR * cfg.TRAIN.BASE_LR}] # <c> 可能是骨干网络和其他的部分 初始学习率不一样
if cfg.ADJUST.ADJUST: # True
trainable_params += [{'params': model.fpn.parameters(),
'lr': cfg.TRAIN.BASE_LR}] # <c>
trainable_params += [{'params': model.ban.parameters(),
'lr': cfg.TRAIN.BASE_LR}]
4. 推理过程
推理过程与训练过程是两个截然不同的部分,一般推理过程和训练过程在同一个tracker类里,不过它们需要分开去定义自己的流程。
边栏推荐
- Fapi_StatusType Fapi_issueProgrammingCommand使用注意事项
- This application has no explicit mapping for /error, so you are seeing this as a fallback
- How tall is the B+ tree of the MySQL index?
- PAT1006
- PTA 找出不是两个数组共有的元素
- Open3D 点云平均点间距评估
- fork创建多个子进程
- PAT1013 并查集 DFS(查找联通分量的个数)
- 人体解析(Human Parse)开源数据集整理
- Semaphore SIGCHLD use, how to make the parent that the child performs over, how to make the distinction between multiple child processes. The end
猜你喜欢
随机推荐
es6Generator函数的异常处理
TIC2000调用API函数Flash擦除片上FLASH失败
wpf实现简易画板功能(带截取画板,签名截图等等)
PAT1014 未解决
Chinese valentine's day?Programmers don't exist
The use of gdb tui
es6对象迭代器iterator
x86 Exception Handling and Interrupt Mechanism (3) Interrupt Handling Process
Oracle Database Architecture
ThreadLocal类
The use of signal function (signal) in C language
【Robustness of VQA-1】——2019-EMNLP-Don’t Take the Easy Way Out
【DB运营管理/开发解决方案】上海道宁为您提供提高工作便利性的集成开发工具——Orange
ICML 2022 | Out-of-Distribution检测与深最近的邻居
log4net使用指南(winform版,sqlserver记录)
C# async 和 await 理解
fork creates multiple child processes
x86异常处理与中断机制(1)概述中断的来源和处理方式
PAT1004
【Data augmentation in NLP】——1