在C ++中重新解释Node.js fii的等价物

我试图在C ++中复制这个例子,我被困在读取数据的绝对最后一步。

exports.TF_ReadTensorData = function(tensor, size, type) { var ptr = libtensorflow.TF_TensorData(tensor); ptr = ptr.reinterpret(size, 0); ptr.type = type; return ptr.deref(); } 

对于C ++,我已经完成了这一点。

 #include <bits/stdc++.h> #include "tf_session_helper.h" #include "tf_session_helper.cc" #include "tf_tensor_helper.cc" #include "tensorflow/core/public/tensor_c_api.h" using namespace std; main() { TF_DataType::TF_UINT16; auto status = TF_NewStatus(); auto status_ops = TF_NewSessionOptions(); auto session = TF_NewSession(status_ops, status); std::ifstream in("graph.pb"); std::string contents((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>()); TF_ExtendGraph(session,contents.c_str(),contents.length(),status); long long adims[] ={}; float aData[] ={3}; auto aTensor = tensorflow::TF_NewTensor_wrapper(TF_DataType::TF_FLOAT,adims,0,aData,(sizeof(aData)/sizeof(*aData))); long long bdims[] ={}; float bData[] ={2}; auto bTensor = tensorflow::TF_NewTensor_wrapper(TF_DataType::TF_FLOAT,bdims,0,bData,(sizeof(bData)/sizeof(*bData))); vector<std::string> input_names; input_names.push_back("a"); input_names.push_back("b"); vector<std::string> output_names; output_names.push_back("c"); vector<std::string> target_names; std::vector<TF_Tensor*> inputs; inputs.push_back(aTensor);inputs.push_back(bTensor); std::vector<TF_Tensor*> output; tensorflow::TF_Run_wrapper(session,input_names,inputs,output_names,output,target_names,status); cout << (TF_GetCode(status) == TF_Code::TF_OK) << "\n"; auto c = output[0]; auto type = TF_TensorType(c); auto dims = TF_NumDims(c); auto size = TF_TensorByteSize(c); auto readed = TF_TensorData(c); cout << type << " " << dims << " " << size << " " << "\n"; } 

我不是真正的C ++专家,我想知道如何在C ++中复制ptr = ptr.reinterpret(size,0)。 另外我正在使用共享库来编译这个。

我假设你想访问readed = TF_TensorData(c) 。 你处理的方式取决于张量c的元素types。 假设它是一个简单types(如floatdoubleint32 ,但不是string ),您可以简单地将数据转换为该types的数组。 例如,假设c是一个float张量:

 float* tensor_data = static_cast<float*>(TF_TensorData(c)); int64 total_elements = 1; for (int i = 0; i < dims; ++i) { total_elements *= TF_Dim(c, i); } // Print every element of the tensor: for (int i = 0; i < total_elements; ++i) { cout << tensor_data[i]; } 

TensorFlow代码库包含使用TF_TensorData()访问tf_session_helper.cc张量内容的tf_session_helper.cc 。 但是请注意,这些示例与使用Python C API交织在一起,因此它们不是最具可读性的代码。

您可能会发现使用TensorFlow C ++ API而不是C API更容易。 example_trainer.cc文件显示了如何使用tensorflow::Session类来运行TensorFlow图,并以tensorflow::Tensor对象的forms检索结果,这些对象更易于操作。