获取输出tensor
/**
* @brief get output tensor for given name.
* @param session given session.
* @param name given name. if NULL, return first output.
* @return tensor if found, NULL otherwise.
*/
Tensor* getSessionOutput(const Session* session, const char* name);
/**
* @brief get all output tensors.
* @param session given session.
* @return all output tensors mapped with name.
*/
const std::map<std::string, Tensor*>& getSessionOutputAll(const Session* session) const;
Interpreter
上提供了两个用于获取输出Tensor
的方法:getSessionOutput
用于获取单个输出tensor,getSessionOutputAll
用于获取输出tensor映射。
在只有一个输出tensor时,可以在调用
getSessionOutput
时传入NULL以获取tensor。
拷贝数据
不熟悉MNN源码的用户,必须使用这种方式获取输出!!!
NCHW (适用于 Caffe / TorchScript / Onnx 转换而来的模型)示例:
auto outputTensor = interpreter->getSessionOutput(session, NULL);
auto nchwTensor = new Tensor(outputTensor, Tensor::CAFFE);
outputTensor->copyToHostTensor(nchwTensor);
auto score = nchwTensor->host<float>()[0];
auto index = nchwTensor->host<float>()[1];
// ...
delete nchwTensor;
NHWC (适用于 Tensorflow / Tflite 转换而来的模型)示例:
auto outputTensor = interpreter->getSessionOutput(session, NULL);
auto nhwcTensor = new Tensor(outputTensor, Tensor::TENSORFLOW);
outputTensor->copyToHostTensor(nhwcTensor);
auto score = nhwcTensor->host<float>()[0];
auto index = nhwcTensor->host<float>()[1];
// ...
delete nhwcTensor;
通过这类拷贝数据的方式,用户只需要关注自己创建的tensor的数据布局,
**copyToHostTensor**
会负责处理数据布局上的转换(如需)和后端间的数据拷贝(如需)。
直接读取数据
由于绝大多数用户都不熟悉MNN底层数据布局,所以不要使用这种方式!!!
auto outputTensor = interpreter->getSessionOutput(session, NULL);
auto score = outputTensor->host<float>()[0];
auto index = outputTensor->host<float>()[1];
// ...
Tensor
上最简洁的输出方式是直接读取host
数据,但这种使用方式仅限于CPU后端,其他后端需要通过deviceid
来读取数据。另一方面,用户需要自行处理NC4HW4
、NHWC
数据格式上的差异。
对于非CPU后端,或不熟悉数据布局的用户,宜使用拷贝数据接口。