Ant*_*ñas 7 dll c-api tensorflow
出于学习目的,如何使用TensorFlow C API对此Python示例进行编码?
import tensorflow as tf
hello = tf.constant("hello TensorFlow!")
sess=tf.Session()
print(sess.run(hello))
Run Code Online (Sandbox Code Playgroud)
我这样试过:
#include <string.h>
#include <iostream.h>
#include "c_api.h"
int main( int argc, char ** argv )
{
TF_Graph * graph = TF_NewGraph();
TF_SessionOptions * options = TF_NewSessionOptions();
TF_Status * status = TF_NewStatus();
TF_Session * session = TF_NewSession( graph, options, status );
char hello[] = "Hello TensorFlow!";
TF_Tensor * tensor = TF_AllocateTensor( TF_STRING, 0, 0, 8 + TF_StringEncodedSize( strlen( hello ) ) );
TF_OperationDescription * operationDescription = TF_NewOperation( graph, "Const", "hello" );
TF_Operation * operation;
struct TF_Output * output;
TF_StringEncode( hello, strlen( hello ), 8 + ( char * ) TF_TensorData( tensor ), TF_StringEncodedSize( strlen( hello ) ), status );
TF_SetAttrTensor( operationDescription, "value", tensor, status );
TF_SetAttrType( operationDescription, "dtype", TF_TensorType( tensor ) );
operation = TF_FinishOperation( operationDescription, status );
output->oper = operation;
output->index = 0;
TF_SessionRun( session, 0,
0, 0, 0, // Inputs
output, &tensor, 1, // Outputs
&operation, 1, // Operations
0, status );
printf( "%i", TF_GetCode( status ) );
TF_CloseSession( session, status );
TF_DeleteSession( session, status );
TF_DeleteStatus( status );
TF_DeleteSessionOptions( options );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在Windows上使用以下命令对其进行测试TensorFlow.dll:http:
//ci.tensorflow.org/view/Nightly/job/nightly-libtensorflow-windows/lastSuccessfulBuild/artifact/lib_package/libtensorflow-cpu-windows-x86_64.zip
以上代码GPF在TF_SessionRun()通话中.一旦我们找到了解决方案,如何检索输出?是否应该使用不同的张量进行输出?上面的代码在输出和操作中重用它.
非常感谢
偏移初始化旁边有一个要解决的错误.这个版本似乎工作正常:
#include <iostream.h>
#include "c_api.h"
int main( int argc, char ** argv )
{
TF_Graph * graph = TF_NewGraph();
TF_SessionOptions * options = TF_NewSessionOptions();
TF_Status * status = TF_NewStatus();
TF_Session * session = TF_NewSession( graph, options, status );
char hello[] = "Hello TensorFlow!";
TF_Tensor * tensor = TF_AllocateTensor( TF_STRING, 0, 0, 8 + TF_StringEncodedSize( strlen( hello ) ) );
TF_Tensor * tensorOutput;
TF_OperationDescription * operationDescription = TF_NewOperation( graph, "Const", "hello" );
TF_Operation * operation;
struct TF_Output output;
TF_StringEncode( hello, strlen( hello ), 8 + ( char * ) TF_TensorData( tensor ), TF_StringEncodedSize( strlen( hello ) ), status );
memset( TF_TensorData( tensor ), 0, 8 );
TF_SetAttrTensor( operationDescription, "value", tensor, status );
TF_SetAttrType( operationDescription, "dtype", TF_TensorType( tensor ) );
operation = TF_FinishOperation( operationDescription, status );
output.oper = operation;
output.index = 0;
TF_SessionRun( session, 0,
0, 0, 0, // Inputs
&output, &tensorOutput, 1, // Outputs
&operation, 1, // Operations
0, status );
printf( "status code: %i\n", TF_GetCode( status ) );
printf( "%s\n", ( ( char * ) TF_TensorData( tensorOutput ) ) + 9 );
TF_CloseSession( session, status );
TF_DeleteSession( session, status );
TF_DeleteStatus( status );
TF_DeleteSessionOptions( options );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们必须删除tensorOutput吗?不知道为什么我们必须添加9(而不是8)来获得字符串的开头.
TF_STRING张量使用此处描述的格式进行编码。在您的代码中,您占用了空间(8 个字节)来编码一个偏移量,但实际上并未对其进行初始化。为此,您需要添加类似以下内容:
memset(TF_TensorData(张量), 0, 8);
在调用之前TF_SetAttrTensor,因为这会将字符串元素的“偏移量”设置为 0(这是您对一个字符串值进行编码的位置)。
对于你的第二个问题:你实际上并没有重复使用相同的tensor指针。注释表明TF_SessionRun正在分配调用者拥有所有权的TF_SessionRun新对象。TF_Tensor因此,在您的代码片段中,tensor变量被覆盖以指向新分配的张量。
希望有帮助。
| 归档时间: |
|
| 查看次数: |
5855 次 |
| 最近记录: |