对于我们的项目来说,网络是由文件加载的。
此刻我加载每个目录的saved_model。
auto tfSessionOpts = TF_NewSessionOptions();
runOpts = nullptr:
TF_Session * pSession = TF_LoadSessionFromSavedModel(tfSessionOpts,
runOpts,
m_strModelDir.c_str(),
m_vecTags.data(),
static_cast<int>(m_vecTags.size()),
m_graph,
nullptr,
status);
现在我必须切换到每个文件加载方法,同时使用c_api。我有一个frozen_graph。pb,我想在C中加载,并从中获取一些信息,用于设置(张量等),并运行会话。我所做的是:
加载frozen_graph。Pb进入缓冲区:
std::ifstream f(m_strModelFile, std::ios::binary);
if (f.seekg(0, std::ios::end).fail()) { throw; }
auto fsize = f.tellg();
if (f.seekg(0, std::ios::beg).fail()) { throw; }
if (fsize <= 0) { throw; }
auto data = static_cast<char*>(std::malloc(fsize));
if (f.read(data, fsize).fail()) { throw; }
TF_Buffer* pBuffer = TF_NewBuffer();
pBuffer->data = data;
pBuffer->length = fsize;
pBuffer->data_deallocator = DeallocateBuffer;
使用缓冲区加载图形(状态为ok):
TF_ImportGraphDefOptions* pGraphDefOptions = TF_NewImportGraphDefOptions();
TF_GraphImportGraphDef(m_graph, pBuffer, pGraphDefOptions, status);
加载会话(状态为ok):
auto tfSessionOpts = TF_NewSessionOptions();
TF_Session* session = TF_NewSession(m_graph, sessionOptions, status);
缓冲区有正确的大小,图和会话不是nullptr和状态说"ok"。但是当我想用图形的时候,就没有信息可以用了。例如,我不能得到具体的操作:
auto input_op = TF_Output{ TF_GraphOperationByName(m_graph, "StatefulPartitionedCall"), 1 };
if (input_op.oper == nullptr)
{
throw; // this happens
}
但是,当我使用TF_LoadSessionFromSavedModel函数构建图时,我可以访问此信息。
是我做错了什么,或者可以用有用的信息的图形不加载每个文件名?
如果c_api是不可能的,那么c++ API是可能的吗?
可能是你没有加载图形操作吗?
std::unique_ptr<TF_ImportGraphDefOptions,
decltype(&TF_DeleteImportGraphDefOptions)> graph_opts = {
TF_NewImportGraphDefOptions(), TF_DeleteImportGraphDefOptions};
TF_GraphImportGraphDef(m_graph.get(), def, graph_opts.get(),
status.get());