如何获取TensorFlowInferenceInterface输出张量的具体维度值?
获取TensorFlowInferenceInterface输出张量的实际维度
嘿,这个问题我之前也碰到过!当输入是动态尺寸的图像时,静态图里的输出节点形状会显示带问号的占位符,但只要你执行完推理,就能拿到实际的维度数值啦。
你可以按照下面的步骤修改你的代码:
执行推理后,先获取输出张量的实际形状
在调用run()之后,不要急着创建固定大小的输出数组,先通过Tensor对象获取实际的维度。这时候因为已经完成了一次推理,张量已经有了具体的尺寸信息。根据形状计算输出数组的大小
用获取到的形状维度计算总元素数,再创建对应大小的数组来接收结果。
修改后的完整代码示例:
TensorFlowInferenceInterface inferenceInterface = new TensorFlowInferenceInterface(assetManager, MODEL_NAME); Operation operation = inferenceInterface.graph().operation(OUTPUT_NAME); // 喂入动态尺寸的输入图像 inferenceInterface.feed(INPUT_NAME, floatValues, 1, bitmapImage.getWidth(), bitmapImage.getHeight(), 3); String[] outputNames = new String[] {OUTPUT_NAME}; inferenceInterface.run(outputNames, true); // 获取输出张量的实际形状 Tensor outputTensor = inferenceInterface.graph().tensor(OUTPUT_NAME); long[] outputShape = outputTensor.shape(); // 计算输出数组的总长度 int outputTotalSize = 1; for (long dim : outputShape) { outputTotalSize *= dim; } // 创建对应大小的数组并获取结果 float[] outputs = new float[outputTotalSize]; inferenceInterface.fetch(OUTPUT_NAME, outputs); // 记得用完张量后关闭,避免内存泄漏 outputTensor.close(); // 现在outputShape里就是具体的维度数值了,比如: // outputShape[0] → batch size(这里是1) // outputShape[1] → 图像高度(和输入的bitmap高度一致) // outputShape[2] → 图像宽度(和输入的bitmap宽度一致) // outputShape[3] → 通道数(这里是2048)
为啥之前拿不到具体维度?因为静态图里的Operation对象只能拿到静态形状(也就是带问号的占位符),只有当推理执行完成,张量被实际计算出来后,才能通过Tensor.shape()获取到运行时的真实维度。
内容的提问来源于stack exchange,提问作者JaufenA
相关产品推荐
相关产品推荐

