如何从内存缓冲区加载张量流图
How to load tensorflow graph from memory buffer
出于可移植性目的,我正在尝试从内存而不是文件加载图形。到目前为止,我尝试的是
tensorflow::GraphDef graph_def;
tensorflow::protobuf::io::CodedInputStream coded_stream( buffer, size );
// Total bytes hard limit / warning limit are set to 1GB and 512MB respectively.
// coded_stream.SetTotalBytesLimit( 1024LL << 20 );
if( !proto->ParseFromCodedStream( &coded_stream ) || !coded_stream.ConsumedEntireMessage() )
{
return tensorflow::errors::DataLoss( "Can't parse ", "memory", " as binary proto" );
}
buffer 是图形文件 'graph.pb' 的字节数组 ( unsigned char* )。此行的代码段错误:
proto->ParseFromCodedStream( &coded_stream )
我也像 或 graph_def.ParseFromString( stringData )
中那样尝试了 graph_def.ParseFromArray(data, len)
但它也崩溃了。我错过了什么吗?谢谢。
ps: 我在 Ubuntu16.04 上使用 Tensorflow 1.9 和 protobuf 2.6.1
编辑
好的,到目前为止,我已经尝试了所有可能的 Parse 函数,但它们都崩溃了,所以我一定错过了一些非常基本的东西。我试过的解析函数是:
- ParseFromArray
- ParseFromString
- ParseFromCodedStream
首先,我将 .pb 文件读入字节数组,如下所示:
std::ifstream is( "graph.pb", std::ios::binary );
std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(is), {});
接下来,我将其转换为字符串:
string data(buffer.begin(), buffer.end());
最后,我打电话给
graph_def.ParseFromString( data )
哪个崩溃了,ParseFromArray()
也一样。烦人的是它崩溃了而不是返回错误,这让我觉得我一定是错过了一些基本的东西。
我不是这方面的专家,我只使用过 python 的 protobufs...但是你是如何在缓冲区中编码内存的?您确定 Coded Stream 的编码正确吗?编码流听起来像是内部细节:
Typically these classes will only be used internally by the protocol buffer library in order to encode and decode protocol buffers.
更多basic/public"SerializeToString", "ParseFromString", "SerializeToOstream", "ParseFromIstream"方法你试过了吗?
崩溃的原因是系统安装的protobuf运行时库版本与代码链接的版本不匹配。特别是,这是错误:
This program requires version 3.5.0 of the Protocol Buffer runtime library, but the installed version is 2.6.1.
我将 protobuf 升级到版本 3.5.0,它工作正常。
出于可移植性目的,我正在尝试从内存而不是文件加载图形。到目前为止,我尝试的是
tensorflow::GraphDef graph_def;
tensorflow::protobuf::io::CodedInputStream coded_stream( buffer, size );
// Total bytes hard limit / warning limit are set to 1GB and 512MB respectively.
// coded_stream.SetTotalBytesLimit( 1024LL << 20 );
if( !proto->ParseFromCodedStream( &coded_stream ) || !coded_stream.ConsumedEntireMessage() )
{
return tensorflow::errors::DataLoss( "Can't parse ", "memory", " as binary proto" );
}
buffer 是图形文件 'graph.pb' 的字节数组 ( unsigned char* )。此行的代码段错误:
proto->ParseFromCodedStream( &coded_stream )
我也像 graph_def.ParseFromString( stringData )
中那样尝试了 graph_def.ParseFromArray(data, len)
但它也崩溃了。我错过了什么吗?谢谢。
ps: 我在 Ubuntu16.04 上使用 Tensorflow 1.9 和 protobuf 2.6.1
编辑 好的,到目前为止,我已经尝试了所有可能的 Parse 函数,但它们都崩溃了,所以我一定错过了一些非常基本的东西。我试过的解析函数是:
- ParseFromArray
- ParseFromString
- ParseFromCodedStream
首先,我将 .pb 文件读入字节数组,如下所示:
std::ifstream is( "graph.pb", std::ios::binary );
std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(is), {});
接下来,我将其转换为字符串:
string data(buffer.begin(), buffer.end());
最后,我打电话给
graph_def.ParseFromString( data )
哪个崩溃了,ParseFromArray()
也一样。烦人的是它崩溃了而不是返回错误,这让我觉得我一定是错过了一些基本的东西。
我不是这方面的专家,我只使用过 python 的 protobufs...但是你是如何在缓冲区中编码内存的?您确定 Coded Stream 的编码正确吗?编码流听起来像是内部细节:
Typically these classes will only be used internally by the protocol buffer library in order to encode and decode protocol buffers.
更多basic/public"SerializeToString", "ParseFromString", "SerializeToOstream", "ParseFromIstream"方法你试过了吗?
崩溃的原因是系统安装的protobuf运行时库版本与代码链接的版本不匹配。特别是,这是错误:
This program requires version 3.5.0 of the Protocol Buffer runtime library, but the installed version is 2.6.1.
我将 protobuf 升级到版本 3.5.0,它工作正常。