ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

yolov3 05节(2)修复bug

2021-11-29 01:34:33  阅读:193  来源: 互联网

标签:yolov3 05 torch cpu start cuda time end bug


关于昨天的检测bug

吐了,昨天的bug还是没修复,详细追踪了下可能错误的地方

在前向传播获得的预测结果就是错的,全部是torch.nan。同时按照正确的流程,最终write_result应该没有检测结果,而不是显示person person...这样的bug。故这两个函数都有问题

1.1)对于write_results函数

首先对相对简单的write_result函数处理,该函数用于获得最终的true检测结果,核心是非极大抑制和IoU

问题出现在最开始的矩阵过滤部分,由于 nan +=/* R(nan与任何实数做运算均为nan,包括比较等),所以下面这段代码不能过滤掉nan值,造成后续直接将coco class类别中的(0,person)错误赋予给了nan

但增加一小段新的(矩阵过滤+赋值)的代码即可实现将nan变为0的操作,其中转为cpu是必须的,如下:

 

这样bug就修复了

 

1.1.1)关于在gpu和cpu上对运算实现加速的有趣误区 

在我最初的印象中,认为使用gpu能极大加速运算,但事实上可能有所出入,对小数据量,反而cpu更快,在我的简单测试中有1000倍差距,通过如下案例理解:

import torch
a = torch.randn(10000, 10000).to('cpu')
b = torch.randn(10000, 10000).to('cpu')

start = time.time()
c = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cpu-0)')

start = time.time()
d = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cpu-0)')

a = a.to('cuda')# 初次调用gpu,由于数据传输,速度会较慢
b = b.to('cuda')
start = time.time()
e = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cuda-0)')

a = a.to('cuda') # 超快的速度fasttttttttttttttt!!!!!!
b = b.to('cuda')
start = time.time()
f = torch.add(a, b)
end = time.time()
print((end-start)*1000 , ' ms(cuda-1)')

i = torch.randn(10000, 10000).to('cuda')
j = torch.randn(10000, 10000).to('cuda')
start = time.time()
k = torch.add(i, j)
end = time.time()
print((end-start)*1000 , ' ms(cuda-2 )')
cuda加速对比

第一次在cuda上计算较慢,但后来就很快了,不知道为什么?望大佬告知

 

而且实际情况没有这么简单:gpu很多核,但每个核心能力不强,并行计算,cpu“单核”,但每个核心超强,串行计算。所以对于上述小数据量测试,cpu单核具有碾压性能,而gpu那没多核反而没用(数据量不够,没必要调用所有的核),单核性能拉跨,所以速度很慢。

但对于图像这类的矩阵运算,超多核+并行 就很有必要了,此时gpu的优势才能体现出来。 https://blog.csdn.net/sru_alo/article/details/93539633

https://blog.csdn.net/qq_36162036/article/details/107407928?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-2.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-2.essearch_pc_relevant

 

 1.2)prediction结果错误

这个原因出在darknet53网络中,今天已经排查了网络的搭建,感觉都没啥问题,明天继续排查前向传播,不过也加深了我对darknet53的理解

总共有107层(75个conv,23个shortcut,4个route,2个upsample,3个yolo)

 

值得一提的是,shortcut层基本可以类比resnet中的残差块,而route层本质就是shortcut,只是出于parse读取文本的原因,使用route这个层来形成>2层数量的连接cat

https://discuss.gluon.ai/t/topic/9056/2

 而且bn层的nb之处可以再次复习一下,其可以实现如下的转换(以简单二维为例)

 

https://blog.csdn.net/qq_29573053/article/details/79878437

 

明天又是充满希望和划水的一天

 

标签:yolov3,05,torch,cpu,start,cuda,time,end,bug
来源: https://www.cnblogs.com/Lazydogewang/p/15617331.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有