TensorFlow Manual Construction of GraphDef

2019-02-14 23:45发布

问题:

In TensorFlow, I found that I can do the following,

from tensorflow.core import framework
from google.protobuf import json_format
graph_def = framework.graph_pb2.GraphDef()
node_def = framework.node_def_pb2.NodeDef()
graph_def.node.extend([node_def])
print json_format.MessageToJson(graph_def)

Which prints

{
  "node": [
    {}
  ]
}

Now, my node is not actually set to an Operation. I can't figure out how to make node_def be an operation. I can construct OpDefs via,

from tensorflow.python.ops import gen_array_ops
const_op_def = gen_array_ops._InitOpDefLibrary()._ops['Const'].op_def

Which is of class <class 'tensorflow.core.framework.op_def_pb2.OpDef'>

I would like to make my NodeDef register as this OpDef.

EDIT:

>>> print json_format.MessageToJson(gen_array_ops._InitOpDefLibrary()._ops['Const'].op_def)
{
  "outputArg": [
    {
      "typeAttr": "dtype", 
      "name": "output"
    }
  ], 
  "name": "Const", 
  "attr": [
    {
      "type": "tensor", 
      "name": "value"
    }, 
    {
      "type": "type", 
      "name": "dtype"
    }
  ]
}

回答1:

I believe you are looking for a way to set message fields inside of the GraphDef and NodeDef protos. How to modify ProtoBuf objects in Python is detailed here