Python 为每个TensorFlow操作获取Protobuf消息
从 有几种方法可以获取已注册Op的Opdef列表: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++中的生成器(对不适用的语言特别有用) 具有协议缓
- C API中的TF_GetAllOpList检索所有已注册的OpDef协议消息。这可用于在中写入生成器 客户端语言。这要求客户端语言具有 协议缓冲区支持,以解释OpDef消息李>
- C++函数opReist::GualLoad()> GeRealStestEdOpSe()返回所有已注册OpDefs的列表(定义在 [tensorflow/core/framework/op.h])。这可用于编写 C++中的生成器(对不适用的语言特别有用) 具有协议缓冲区支持)李>
- 该列表的ASCII序列化版本会定期由一个自动化系统检入[tensorflow/core/ops/ops.pbtxt] 过程
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块,我需要再进一步。还是卡住了。