图像预处理的数据精度问题报出的Nan

问题描述:git上的一个官方项目,图像预处理操作,使用torch进行处理,包含Resize,ToTensor,Nomalize,处理后的结果输入到trt-fp16精度的模型中,可以正常输出。我对图像预处理进行了修改,使用opencv进行resize,numpy进行totensor,nomalize操作,处理后的结果输出到trt-fp16的模型中,发现输出结果都是Nan。

问题解决:通过数据对比,发现torch处理的结果数据类型是fp32,而numpy处理的结果是fp64(pytorch对于浮点类型默认为float32,而numpy的默认类型是float64),这就是问题的原因,说明fp64输入到trt-fp16中超过了精度表示,因为只有超出精度表示基本才会出现nan,但是不清楚fp64到fp16这个过程发生了什么样的类型转换

关于上面的问题,我们先来说一说精度的问题:

fp32、fp16、bf16分别称为单精度浮点数、半精度浮点数、半精度浮点数,其中fp16是intel提出的,bf16是nvidia提出的,fp16和bf16所占存储空间是fp32的一半。

fp16的动态范围是5.96E−8~ 65504,bf16的动态范围是9.2E−41~3.38E38,fp32的动态范围是1.4E-45 ~ 3.40E38,可以看出bf16的数值范围几乎和fp32的范围一样大,这样可以避免fp16容易上、下溢的问题。但是其损失了精度,因为它有8个指数位、尾数位只有7位,而fp16有5个指数位,10个尾数位(也叫小数位)。所以我们常说的超出精度表示范围有两个情况,一种是超出数值范围,一种是超出精度范围,例如超出小数点位数

而fp64称为双精度浮点类型

用64位二进制表示,其中1位用于sign,11位用于exponent,52位用于fraction。它的数值范围大约是2.23e-308到1.80e308,精度大约是15到17位有效数字。它通常用于科学计算中对精度要求较高的场合,但在深度学习中不常用,因为它占用的内存和计算资源较多。

posted @ 2024-04-12 09:12  海_纳百川  阅读(102)  评论(0编辑  收藏  举报
本站总访问量