TensorFlow可以使用JSON之类的数据吗?

时间:2018-02-20 15:16:07

标签: tensorflow deep-learning

假设我们有一个JSON记录,如:

{
   "Name" : "Tom",
   "Diseases" : [{
          "Asthma" : [{
                        "Severity":5
                        "Medication" : [{
                                         "Benzene" : [{
                                                       "Start Date" : 10-5-2017,
                                                       "End Date" : 22-5-2018
                                                      }]
                                       }]
                     }]
                 }]
}

它有很多相互依赖的功能,有没有办法可以将它输入到TensorFlow Deep神经网络中?

2 个答案:

答案 0 :(得分:2)

或多或少,但不是直接的。有一个API可以提供JSON数据,但这必须是JSON mappingtf.train.Example protocol buffers object。但是,这些对象不能像您显示的那样保存分层数据,只有features的集合对应于整数,浮点数或字节。在你的情况下,你可能是这样的:

{
  "features": {
    "feature": {
       "Name": { "bytes_list": { value: ["VG9t"] } },
       "Disease": { "bytes_list": { value: ["QXN0aG1h"] } },
       "Severity": { "int64_list": { value: [5] } },
       "Medication": { "bytes_list": { value: ["QmVuemVuZQ=="] } }
    }
  }
}

请注意,字符串必须以字节数组的形式给出,需要在Base64中以协议缓冲区的JSON格式进行编码。但是,这不允许有多种疾病的记录,因为正如我所说,它不支持层次结构。

例如,您可以为每位患者和疾病提供一条记录。如果您实际上已经达到了将JSON文档作为输入的点,则可以使用tf.decode_json_example来获取对象的协议缓冲区二进制表示,然后使用tf.parse_example来实际获取张量。

答案 1 :(得分:0)

2021 年更新:

现在似乎有 tfio.experimental.serialization.decode_json 的实验性支持,但还没有太多文档。

您可以在 PRunit tests

中阅读更多内容

示例代码:

import tensorflow_io as tfio

json_text = r'{"test":["this","is","some","data"],"bar":42,"baz":[[1,2],[2,3],[3,4],[4,5]]}'

specs = {
    "test": tf.TensorSpec(tf.TensorShape([4]), tf.string),
    "bar": tf.TensorSpec(tf.TensorShape([]), tf.int32),
    "baz": tf.TensorSpec(tf.TensorShape([4,2]), tf.int32),
}
parsed = tfio.experimental.serialization.decode_json(json_text, specs)

print(parsed)

输出:

{
    'test': <tf.Tensor: shape=(4,), dtype=string, numpy=array([b'this', b'is', b'some', b'data'], dtype=object)>, 
    'bar': <tf.Tensor: shape=(), dtype=int32, numpy=42>, 
    'baz': <tf.Tensor: shape=(4, 2), dtype=int32, numpy=
    array([[1, 2],
           [2, 3],
           [3, 4],
           [4, 5]], dtype=int32)>
}