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_desc 和 output_desc:TensorFlow 图中输入和输出节点的描述。其中每一个都包含以下字段:
-
op_name:创建和训练模型时设置的操作节点名称。您通常可以从
tfmodel.inputs
和tfmodel.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_desc
:image_input
-
output_desc
:OUTPUT/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_start 和 dim 将其指定为简单范围(例如 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
}
]
}
]
}