Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在使用c++;?_C++_Tensorflow - Fatal编程技术网

C++ 如何在使用c++;?

C++ 如何在使用c++;?,c++,tensorflow,C++,Tensorflow,我用bazel构建了一个非常简单的定制opzero_out.dll,它在使用python时工作 import tensorflow as tf zero_out_module = tf.load_op_library('./zero_out.dll') with tf.Session(''): zero_out_module.zero_out([[1, 2], [3, 4]]).eval() 但是,我必须用C++来运行推理,有没有类似于 TF.LoopyoppLoopy的C++ API,因

我用bazel构建了一个非常简单的定制op
zero_out.dll
,它在使用python时工作

import tensorflow as tf
zero_out_module = tf.load_op_library('./zero_out.dll')
with tf.Session(''):
  zero_out_module.zero_out([[1, 2], [3, 4]]).eval()

<>但是,我必须用C++来运行推理,有没有类似于 TF.LoopyoppLoopy<代码>的C++ API,因为在Tf.LoopyoppLoopy< /C>中,已经做了大量的注册工作,TF没有对应C++ C++ API?< /P> < P>。库加载函数在中公开(这是使用的API)。没有关于它的“好”文档,但您可以在以下位置找到它们:

//--------------------------------------------------------------------------
//加载包含自定义操作和内核的插件
//TF_库保存有关动态加载的TensorFlow插件的信息。
类型定义结构TF_库TF_库;
//加载由库文件名指定的库,并注册ops和
//该库中存在的内核。
//
//将“library\u filename”传递给特定于平台的机制,以便
//加载库。确定设备准确位置的规则
//库是特定于平台的,此处没有记录。
//
//成功后,将“确定”置于状态并返回新创建的库句柄。
//调用方拥有库句柄。
//
//失败时,将错误状态置于status并返回NULL。
TF_CAPI_导出外部TF_库*TF_加载库(常量字符*库文件名,
TF_状态*状态);
//获取lib_handle指向的库中定义的opdef的OpList。
//
//返回TF_缓冲区。结果指向的内存归
//lib_手柄。缓冲区中的数据将是
//在库中定义的操作。
TF_CAPI_导出外部TF_缓冲区TF_GetOpList(TF_库*lib_句柄);
//释放与库句柄关联的内存。
//不卸载库。
TF_CAPI_导出外部无效TF_删除库句柄(TF_库*库句柄);
<>这些函数实际上调用C++代码(参见源代码)。但是,中定义的被调用函数没有要包含的头。使用C++代码的方法是自己声明函数,并链接TysFROULL库。

namespace tensorflow{
//加载TensorFlow插件(一个.so文件)的助手。
状态LoadLibrary(常量字符*库文件名,无效**结果,
结构空隙**buf,尺寸*len);
}
据我所知,没有API可以卸载库。C API只允许删除库句柄对象。这只需释放指针即可完成,但如果您想避免麻烦,您可能应该使用TensorFlow提供的释放函数,
TensorFlow::port:free
,在中声明。同样,如果您不能或不想包含该函数,您可以自己声明该函数,它也应该可以工作

namespace tensorflow{
命名空间端口{
无空隙(空隙*ptr);
}
}

可能存在的重复项。DLL和此类功能是通过Windows API处理的。@Romen它实际上不是一个副本,因为TensorFlow库加载在注册加载的操作/内核方面做了一些特殊的额外工作。@jdehsa,我认为这可能是一个有用的链接。我找不到一个等效的方法,也就是在C++的ToSoReFas-App中从一个库加载OPS。非常有用的信息!我尝试使用
TF_LoadLibrary
#include“c_api.h”
TF_Status*Status_load=TF_NewStatus()加载lib
TF_Library*lib_handle=TF_LoadLibrary(“C:\\custom_op\\zero_out.dll”,状态为\u load)
可能有点奇怪,但我自己还没有尝试过,所以我不知道会出现什么问题。如果您在中查看Windows的
LoadLibrary
的impl,您似乎确实应该使用绝对路径(因为使用了
LOAD\u WITH\u Changed\u SEARCH\u path
)。。。但似乎您得到的错误实际上只是意味着失败,所以可能是其他原因。@jdejesa我发现需要
python36.dll,尽管它没有被使用。现在
TF\u code code=TF\u GetCode(状态\u加载)
返回代码是
TF\u OK
,然后我使用
TF\u Buffer op\u list\u buf=TF\u GetOpList(lib\u handle)
获取op list,但是
op\u list\u buf.length
返回0,您能给出一些代码片段来获取自定义op lib中的接口函数吗?@7oud奇怪的是,您需要Python dll,C lib的要点是自包含的。无论如何,关于TF_GetOpList,我自己没有用过,所以我不确定。您应该从
TF_Buffer
中的
数据创建一个mesasge(例如,使用)-如果长度为零,我猜这是一个空列表。注册op可能有问题?@Fisa否,如果您使用的是Python中的
tf.load_op_library
,则无需执行任何其他操作,这是Python的正常TensorFlow分布的一部分。C API仅适用于使用不同的编程语言运行模型的情况,例如C或C++,需要使用外部库的操作(因此,您需要一种方法来执行与代码中的代码> TF.LoopyoppLoopy)。