解决TensorRT同一数据每次返回结果都不一致问题

问题描述:

最近进行把TF的模型转化为UFF文件部署到TensorRT。在进行测试的时候发现一个问题,同一个数据使用TRT进行推理,但是每次结果都不一样。输出的结果本应是softmax算子输出结果, 但是输出结果都是随机的,数值求和结果非1,有的非常大有的非常小非常没有规律。

排查了一整天发现是因为我的日志头文件导入的顺序导致这个问题。

#include "easylogging++.h"
#include "common.h"
#include "buffers.h"
#include "NvInfer.h"
#include "NvUffParser.h"
#include "cuda_runtime_api.h"

没有问题的。

#include "common.h"
#include "easylogging++.h"
#include "buffers.h"
#include "NvInfer.h"
#include "NvUffParser.h"
#include "cuda_runtime_api.h"

出现上面的问题。

#include "common.h"
#include "buffers.h"
#include "NvInfer.h"
#include "NvUffParser.h"
#include "cuda_runtime_api.h"
#include "easylogging++.h"

没问题。

总结:发现是因为把“easylogging++.h”放到了“common.h”和“buffers.h”中间导致的问题。应该是什么地方给冲突了。没有认真研究其中原因。

记录一下!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用TensorRT进行深度学习推理时,可以通过以下步骤处理TensorRT输出数据: 1. 获取TensorRT引擎的输出张量。通常可以通过以下代码获取: ``` void* buffers[engine.getNbBindings()]; for (int i = 0; i < engine.getNbBindings(); i++) { if (engine.bindingIsInput(i)) { buffers[i] = malloc(batchSize * inputSize * sizeof(float)); } else { buffers[i] = malloc(batchSize * outputSize * sizeof(float)); } } engineContext->executeV2(buffers); float* output = reinterpret_cast<float*>(buffers[outputIndex]); ``` 其中,`outputIndex`是TensorRT引擎输出张量的索引,`outputSize`是输出张量的大小。 2. 对输出张量进行后处理。具体的后处理方法取决于模型的任务和输出类型。以下是一些常见的后处理方法示例: - 分类任务:通常需要对输出进行softmax归一化,并选择最大的概率作为预测结果。示例代码: ``` float *probs = new float[numClasses]; softmax(output, probs, numClasses); int maxIndex = 0; for (int i = 1; i < numClasses; i++) { if (probs[i] > probs[maxIndex]) { maxIndex = i; } } delete[] probs; ``` - 目标检测任务:通常需要对输出进行解码,得到检测框的位置和类别信息。示例代码: ``` float* detectionOut = new float[detectionOutputSize]; cudaMemcpy(detectionOut, output, detectionOutputSize * sizeof(float), cudaMemcpyDeviceToHost); // 解码检测框 for (int i = 0; i < numDetections; ++i) { float* det = detectionOut + i * detectionOutputSizePerClass; // 计算检测框的位置 float centerX = det[0] * inputW; float centerY = det[1] * inputH; float width = det[2] * inputW; float height = det[3] * inputH; // 计算检测框的类别 int classId = static_cast<int>(det[5]); float score = det[4]; // ... } delete[] detectionOut; ``` - 语音识别任务:通常需要对输出进行解码,得到识别结果。示例代码: ``` float* outputHost = new float[outputSize]; cudaMemcpy(outputHost, output, outputSize * sizeof(float), cudaMemcpyDeviceToHost); // 解码识别结果 std::vector<int> result; for (int i = 0; i < outputSize; i++) { int index = std::max_element(outputHost + i * numClasses, outputHost + (i+1) * numClasses) - outputHost; result.push_back(index); } delete[] outputHost; ``` 以上是一些常见的TensorRT输出后处理方法示例。具体的方法取决于模型的任务和输出类型,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值