tf_model_desc.json 概述

在导入外部训练的 TensorFlow 模型之前,您必须:

  • 将模型保存为冻结图 (.pb) 格式

  • 创建 tf_model_desc.json,向 Vertica 数据库描述如何将其输入和输出映射到输入/输出表

方便的是,Machine-Learning-Examples 存储库的 TensorFlow 目录中(和opt/vertica/packages/TFIntegration/examples中)包含的脚本 freeze_tf2_model.py 会自动完成这两项工作。在大多数情况下,生成的 tf_model_desc.json 可以按原样使用,但对于较复杂的数据集和用例,您可能需要对其进行编辑。

用于示例数据集的 tf_model_desc.json

下面的 tf_model_desc.json 是从 TensorFlow 示例 使用的 MNIST 手写数据集生成的。

{
    "frozen_graph": "mnist_keras.pb",
    "input_desc": [
        {
            "op_name": "image_input",
            "tensor_map": [
                {
                    "idx": 0,
                    "dim": [
                        1,
                        28,
                        28,
                        1
                    ],
                    "col_start": 0
                }
            ]
        }
    ],
    "output_desc": [
        {
            "op_name": "OUTPUT/Softmax",
            "tensor_map": [
                {
                    "idx": 0,
                    "dim": [
                        1,
                        10
                    ],
                    "col_start": 0
                }
            ]
        }
    ]
}

该文件描述了模型输入和输出的结构。它必须包含一个与 .pb 模型的文件名匹配的 frozen_graph 字段、一个 input_desc 字段和一个 output_desc 字段。

  • input_descoutput_desc:TensorFlow 图中输入和输出节点的描述。其中每一个都包含以下字段:
    • op_name:创建和训练模型时设置的操作节点名称。您通常可以从 tfmodel.inputstfmodel.outputs 检索这些参数的名称。例如:

      
      $ print({t.name:t for t in tfmodel.inputs})
      {'image_input:0': <tf.Tensor 'image_input:0' shape=(?, 28, 28, 1) dtype=float32>}
      
      $ print({t.name:t for t in tfmodel.outputs})
      {'OUTPUT/Softmax:0': <tf.Tensor 'OUTPUT/Softmax:0' shape=(?, 10) dtype=float32>}
      

      在本例中,op_name 的相应值如下。

      • input_descimage_input

      • output_descOUTPUT/Softmax

      有关此过程的更详细示例,请查看 freeze_tf2_model.py 的代码。

    • tensor_map:如何将张量映射到可通过以下方式指定的 Vertica 列:

      • idx:张量的索引(第一个输入/输出应为 0,第二个输入/输出应为 1,等等)

      • dim:保存张量维度的向量;它提供了列数

      • col_start(仅在未指定 col_idx 时使用):起始列索引。当与 dim 一起使用时,它指定从 col_start 开始、在 col_start+dim 结束的 Vertica 列的索引范围;Vertica 从索引 col_start 指定的列处开始,获取接下来的 dim

      • col_idx:Vertica 列中对应于修整张量的索引。这允许您显式指定 Vertica 列的索引,否则无法使用 col_startdim 将其指定为简单范围(例如 1、3、5、7)

      • data_type(未显示):输入或输出的数据类型,为以下之一:

        • TF_FLOAT(默认值)

        • TF_DOUBLE

        • TF_INT8

        • TF_INT16

        • TF_INT32

        • TF_INT64

复杂 tf_model_desc.json 示例

下面是一个包含多个输入和输出的较复杂示例:

{
    "input_desc": [
        {
            "op_name": "input1",
            "tensor_map": [
                {
                    "idx": 0,
                    "dim": [
                        4
                    ],
                    "col_idx": [
                        0,
                        1,
                        2,
                        3
                    ]
                },
                {
                    "idx": 1,
                    "dim": [
                        2,
                        2
                    ],
                    "col_start": 4
                }
            ]
        },
        {
            "op_name": "input2",
            "tensor_map": [
                {
                    "idx": 0,
                    "dim": [],
                    "col_idx": [
                        8
                    ]
                },
                {
                    "idx": 1,
                    "dim": [
                        2
                    ],
                    "col_start": 9
                }
            ]
        }
    ],
    "output_desc": [
        {
            "op_name": "output",
            "tensor_map": [
                {
                    "idx": 0,
                    "dim": [
                        2
                    ],
                    "col_start": 0
                }
            ]
        }
    ]
}

另请参阅