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
Python 为每个TensorFlow操作获取Protobuf消息_Python_Tensorflow_Protocol Buffers - Fatal编程技术网

Python 为每个TensorFlow操作获取Protobuf消息

Python 为每个TensorFlow操作获取Protobuf消息,python,tensorflow,protocol-buffers,Python,Tensorflow,Protocol Buffers,从 有几种方法可以获取已注册Op的Opdef列表: C API中的TF_GetAllOpList检索所有已注册的OpDef协议消息。这可用于在中写入生成器 客户端语言。这要求客户端语言具有 协议缓冲区支持,以解释OpDef消息 C++函数opReist::GualLoad()> GeRealStestEdOpSe()返回所有已注册OpDefs的列表(定义在 [tensorflow/core/framework/op.h])。这可用于编写 C++中的生成器(对不适用的语言特别有用) 具有协议缓

有几种方法可以获取已注册Op的Opdef列表:

  • C API中的TF_GetAllOpList检索所有已注册的OpDef协议消息。这可用于在中写入生成器 客户端语言。这要求客户端语言具有 协议缓冲区支持,以解释OpDef消息
  • C++函数opReist::GualLoad()> GeRealStestEdOpSe()返回所有已注册OpDefs的列表(定义在 [tensorflow/core/framework/op.h])。这可用于编写 C++中的生成器(对不适用的语言特别有用) 具有协议缓冲区支持)
  • 该列表的ASCII序列化版本会定期由一个自动化系统检入[tensorflow/core/ops/ops.pbtxt] 过程
但是,唉,我想用Python这样做

import tensorflow as tf
from google.protobuf import json_format
json_string = json_format.MessageToJson(tf.GetAllOpsList())

我想要一种方法来获取Tensorflow中每个操作的Protobuf消息,这样我就可以通过
ops.txt
将其作为JSON转储。下面是一个示例,其中列出了生成字符串输出的ops的所有
OpDef
消息

import tensorflow as tf

from tensorflow.core.framework import op_def_pb2
from google.protobuf import text_format

def get_op_types(op):
    for attr in op.attr:
        if attr.type != 'type':
            continue
        return list(attr.allowed_values.list.type)
    return []

# directory where you did "git clone"
tensorflow_git_base = "/Users/yaroslav/tensorflow.git"
ops_file = tensorflow_git_base+"/tensorflow/tensorflow/core/ops/ops.pbtxt"
ops = op_def_pb2.OpList()
text_format.Merge(open(ops_file).read(), ops)

for op in ops.op:
    # get templated string types
    if tf.string in get_op_types(op):
        print(op.name, op.summary)
    #for arg in op.input_arg:
    for arg in op.output_arg:
        if arg.type == tf.string:
            print(op.name, op.summary)
            break
**增加** 如果您想对添加的新操作保持敏感,可以对当前Python包装器的工作方式进行反向工程。例如,考虑<代码> GeNyArayaOp.Py < /Cord>文件。它有以下代码段

def _InitOpDefLibrary():
  op_list = _op_def_pb2.OpList()
  _text_format.Merge(_InitOpDefLibrary.op_list_ascii, op_list)
  _op_def_registry.register_op_list(op_list)
  op_def_lib = _op_def_library.OpDefLibrary()
  op_def_lib.add_op_list(op_list)
  return op_def_lib


_InitOpDefLibrary.op_list_ascii = """op {
  name: "BatchMatrixBandPart"
  input_arg {
    name: "input"
    type_attr: "T"
  }
  input_arg {
    name: "num_lower"
    type: DT_INT64
  }
  input_arg {
    name: "num_upper"
    type: DT_INT64
  }
  output_arg {
    name: "band"
    type_attr: "T"
  }
  attr {
    name: "T"
    type: "type"
  }
  deprecation {
    version: 14
    explanation: "Use MatrixBandPart"
  }
}

因此,这些消息protobufs是在生成
gen\u array\u ops
期间从底层C代码生成的。要了解它们是如何生成的,请参见
ops.txt中的。下面是一个示例,其中列出了生成字符串输出的ops的所有
OpDef
消息

import tensorflow as tf

from tensorflow.core.framework import op_def_pb2
from google.protobuf import text_format

def get_op_types(op):
    for attr in op.attr:
        if attr.type != 'type':
            continue
        return list(attr.allowed_values.list.type)
    return []

# directory where you did "git clone"
tensorflow_git_base = "/Users/yaroslav/tensorflow.git"
ops_file = tensorflow_git_base+"/tensorflow/tensorflow/core/ops/ops.pbtxt"
ops = op_def_pb2.OpList()
text_format.Merge(open(ops_file).read(), ops)

for op in ops.op:
    # get templated string types
    if tf.string in get_op_types(op):
        print(op.name, op.summary)
    #for arg in op.input_arg:
    for arg in op.output_arg:
        if arg.type == tf.string:
            print(op.name, op.summary)
            break
**增加** 如果您想对添加的新操作保持敏感,可以对当前Python包装器的工作方式进行反向工程。例如,考虑<代码> GeNyArayaOp.Py < /Cord>文件。它有以下代码段

def _InitOpDefLibrary():
  op_list = _op_def_pb2.OpList()
  _text_format.Merge(_InitOpDefLibrary.op_list_ascii, op_list)
  _op_def_registry.register_op_list(op_list)
  op_def_lib = _op_def_library.OpDefLibrary()
  op_def_lib.add_op_list(op_list)
  return op_def_lib


_InitOpDefLibrary.op_list_ascii = """op {
  name: "BatchMatrixBandPart"
  input_arg {
    name: "input"
    type_attr: "T"
  }
  input_arg {
    name: "num_lower"
    type: DT_INT64
  }
  input_arg {
    name: "num_upper"
    type: DT_INT64
  }
  output_arg {
    name: "band"
    type_attr: "T"
  }
  attr {
    name: "T"
    type: "type"
  }
  deprecation {
    version: 14
    explanation: "Use MatrixBandPart"
  }
}

因此,这些消息protobufs是在生成
gen\u array\u ops
期间从底层C代码生成的。要跟踪它们是如何生成的,请参见

我更喜欢Python方式,这样我可以添加自定义操作,并从添加的额外信息中获取Protobuf。您可以通过调用与生成gen_*\u ops.py期间相同的生成脚本来重新生成“ops.txt”,也可以找到底层C功能并添加一些swig wrapperstanks!差不多了。我不关心ascii,但我需要JSON。所以我把它从google.protobuf import json_format改为
,发现
json_format.MessageToJson(gen_array_ops.\u InitOpDefLibrary()。_ops['Const'].op_def)
几乎能满足我的需求。这只是metaInfoDef,但我需要graphDef块,我需要再进一步。还是卡住了。我更喜欢Python方式,这样我就可以添加自定义操作,并从添加的额外信息中获取Protobuf。您可以通过调用与生成gen_*\u ops.py期间相同的生成脚本来重新生成“ops.txt”,也可以找到底层C功能并添加一些swig wrapperstanks!差不多了。我不关心ascii,但我需要JSON。所以我把它从google.protobuf import json_format改为
,发现
json_format.MessageToJson(gen_array_ops.\u InitOpDefLibrary()。_ops['Const'].op_def)
几乎能满足我的需求。这只是metaInfoDef,但我需要graphDef块,我需要再进一步。还是卡住了。