【问题标题】:How to load tensorflow graph from memory buffer如何从内存缓冲区加载张量流图
【发布时间】:2019-12-25 06:03:50
【问题描述】:

出于可移植性目的,我正在尝试从内存而不是文件加载图表。到目前为止,我尝试的是

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.ParseFromArray(data, len),就像在这个postgraph_def.ParseFromString( stringData ) 中一样,但它也崩溃了。我错过了什么吗?谢谢。

ps:我在 Ubuntu16.04 上使用 Tensorflow 1.9 和 protobuf 2.6.1

编辑 好的,到目前为止,我已经尝试了所有可能的 Parse 函数,但它们都崩溃了,所以我一定错过了一些非常基本的东西。我尝试过的 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() 也是如此。烦人的部分是它崩溃而不是返回错误,这让我觉得我一定错过了一些基本的东西。

【问题讨论】:

  • ParseFromArray 崩溃,出现哪个错误?
  • 嗨@Stefan,它在 CreateMessage() 函数中的段错误如下: tensorflow::GraphDef* google::protobuf::Arena::CreateMessage<:graphdef>() at 0x7fffc48e2ff1 google: :protobuf::MessageLite::ParseFromArray() 在 0x7fffbe3b5038
  • 图表的大小是多少?你注意到代码中的注释部分了吗?
  • @Meisam 我有 2 个文件,一个是 19.2MB,一个是 196.5MB。两个文件都失败了。

标签: c++ tensorflow graph protocol-buffers


【解决方案1】:

我在这里不是专家,我只使用了 python 中的 protobufs...但是你是如何在缓冲区中编码该内存的?你确定它为Coded Stream 编码正确吗? Coded Streams 听起来像是一个内部细节:

通常,这些类将仅由协议缓冲区库在内部使用,以便对协议缓冲区进行编码和解码。

您是否尝试过更基本/公开的"SerializeToString", "ParseFromString", "SerializeToOstream", "ParseFromIstream" 方法?

【讨论】:

  • 嗨@mdaoust .pb 文件可以由函数 ReadBinaryProto 加载,所以我假设它可以由 ParseFromString 加载,但是它也不起作用。
【解决方案2】:

它崩溃的原因是系统上安装的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,它运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2013-01-10
    • 2011-03-31
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多