从 python API 而不是 saved_model_cli 中提取(或设置)input/output TF 张量名称信息
Extract (or Set) input/output TF tensor names information from python API instead of saved_model_cli
我用 Keras/TF2.5 训练了一个简单的模型并将其保存为已保存的模型。
tf.saved_model.save(my_model,'/path/to/model')
如果我通过
检查它
saved_model_cli show --dir /path/to/model --tag_set serve --signature_def serving_default
我得到这些 outputs/names:
inputs['conv2d_input'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 32, 32, 1)
name: serving_default_conv2d_input:0
outputs['dense'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 2)
name: StatefulPartitionedCall:0
名字serving_default_conv2d_input
和StatefulPartitionedCall
其实可以用来推理
我想使用 python API 提取它们。如果我通过加载模型来查询它:
>>> m=tf.saved_model.load('/path/to/model')
>>> m.signatures['serving_default'].inputs[0].name
'conv2d_input:0'
>>> m.signatures['serving_default'].outputs[0].name
'Identity:0'
我得到完全不同的名字。
问题:
- 如何从 python API 中提取这些名称
serving_default_conv2d_input
和 StatefulPartitionedCall
?
- 或者,我如何在调用
tf.saved_model.save
时 define/fix 名称?
:0
是什么意思?
附带问题:
如何通过 SavedModel 将 TF 模型部署到生产环境?
saved_model_cli
显示的input/output张量名可以提取如下:
from tensorflow.python.tools import saved_model_utils
saved_model_dir = '/path/to/model'
tag_set = 'serve'
signature_def_key = 'serving_default'
# 1. Load MetaGraphDef with saved_model_utils
meta_graph_def = saved_model_utils.get_meta_graph_def(saved_model_dir, tag_set)
# 2. Get input signature names
input_signatures = list(meta_graph_def.signature_def[signature_def_key].inputs.values())
input_names = [signature.name for signature in input_signatures]
print(input_names) # ['serving_default_conv2d_input:0']
# 3. Get output signature names
output_signatures = list(meta_graph_def.signature_def[signature_def_key].outputs.values())
output_names = [signature.name for signature in output_signatures]
print(output_names) # ['StatefulPartitionedCall:0']
关于:0
的含义,op_name:0
表示“作为称为op_name
的操作的第0个输出的张量”。因此,您可能会使用 …:1
来获取具有多个输出的操作的输出,但许多操作都是单输出,因此您将始终对它们使用 …:0
(来源:)。
我用 Keras/TF2.5 训练了一个简单的模型并将其保存为已保存的模型。
tf.saved_model.save(my_model,'/path/to/model')
如果我通过
检查它saved_model_cli show --dir /path/to/model --tag_set serve --signature_def serving_default
我得到这些 outputs/names:
inputs['conv2d_input'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 32, 32, 1)
name: serving_default_conv2d_input:0
outputs['dense'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 2)
name: StatefulPartitionedCall:0
名字serving_default_conv2d_input
和StatefulPartitionedCall
其实可以用来推理
我想使用 python API 提取它们。如果我通过加载模型来查询它:
>>> m=tf.saved_model.load('/path/to/model')
>>> m.signatures['serving_default'].inputs[0].name
'conv2d_input:0'
>>> m.signatures['serving_default'].outputs[0].name
'Identity:0'
我得到完全不同的名字。
问题:
- 如何从 python API 中提取这些名称
serving_default_conv2d_input
和StatefulPartitionedCall
? - 或者,我如何在调用
tf.saved_model.save
时 define/fix 名称? :0
是什么意思?
附带问题:
如何通过 SavedModel 将 TF 模型部署到生产环境?
saved_model_cli
显示的input/output张量名可以提取如下:
from tensorflow.python.tools import saved_model_utils
saved_model_dir = '/path/to/model'
tag_set = 'serve'
signature_def_key = 'serving_default'
# 1. Load MetaGraphDef with saved_model_utils
meta_graph_def = saved_model_utils.get_meta_graph_def(saved_model_dir, tag_set)
# 2. Get input signature names
input_signatures = list(meta_graph_def.signature_def[signature_def_key].inputs.values())
input_names = [signature.name for signature in input_signatures]
print(input_names) # ['serving_default_conv2d_input:0']
# 3. Get output signature names
output_signatures = list(meta_graph_def.signature_def[signature_def_key].outputs.values())
output_names = [signature.name for signature in output_signatures]
print(output_names) # ['StatefulPartitionedCall:0']
关于:0
的含义,op_name:0
表示“作为称为op_name
的操作的第0个输出的张量”。因此,您可能会使用 …:1
来获取具有多个输出的操作的输出,但许多操作都是单输出,因此您将始终对它们使用 …:0
(来源: