我对tensorflow尤其是2.0版本非常陌生,因为关于该API的示例不足,但它似乎比1.x方便得多到目前为止,我设法使用tf.estimator api训练线性模型,然后设法使用tf.estimator.exporter保存它。
[之后,我想使用tf.saved_model api加载此模型,并且我认为我可以成功完成此操作,但是我对我的过程有一些疑问,因此可以快速浏览一下我的代码:
所以我有一系列使用tf.feature_column api创建的功能,它看起来像这样:
feature_columns =
[NumericColumn(key='geoaccuracy', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
NumericColumn(key='longitude', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
NumericColumn(key='latitude', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
NumericColumn(key='bidfloor', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
VocabularyListCategoricalColumn(key='adid', vocabulary_list=('115', '124', '139', '122', '121', '146', '113', '103', '123', '104', '147', '114', '149', '148'), dtype=tf.string, default_value=-1, num_oov_buckets=0),
VocabularyListCategoricalColumn(key='campaignid', vocabulary_list=('36', '31', '33', '28'), dtype=tf.string, default_value=-1, num_oov_buckets=0),
VocabularyListCategoricalColumn(key='exchangeid', vocabulary_list=('1241', '823', '1240', '1238'), dtype=tf.string, default_value=-1, num_oov_buckets=0),
...]
之后,我以这种方式使用要素列数组定义一个估算器,并对其进行训练。直到这里,没问题。
linear_est = tf.estimator.LinearClassifier(feature_columns=feature_columns)
在训练了模型之后,我想保存它,所以这里引起了疑问,这是我的操作方法,但不确定这是正确的方法:
serving_input_parse = tf.feature_column.make_parse_example_spec(feature_columns=feature_columns)
""" view of the variable : serving_input_parse =
{'adid': VarLenFeature(dtype=tf.string),
'at': VarLenFeature(dtype=tf.string),
'basegenres': VarLenFeature(dtype=tf.string),
'bestkw': VarLenFeature(dtype=tf.string),
'besttopic': VarLenFeature(dtype=tf.string),
'bidfloor': FixedLenFeature(shape=(1,), dtype=tf.float32, default_value=None),
'browserid': VarLenFeature(dtype=tf.string),
'browserlanguage': VarLenFeature(dtype=tf.string)
...} """
# exporting the model :
linear_est.export_saved_model(export_dir_base='./saved',
serving_input_receiver_fn=tf.estimator.export.build_parsing_serving_input_receiver_fn(serving_input_receiver_fn),
as_text=True)
[现在我尝试加载它,并且我不知道如何使用加载的模型使用例如来自pandas数据帧的原始数据对其进行调用的预测
loaded = tf.saved_model.load('saved/1573144361/')
还有一件事,我试图看一下模型的签名,但我无法真正理解输入形状的状态
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
signature_def['classification']:
The given SavedModel SignatureDef contains the following input(s):
inputs['inputs'] tensor_info:
dtype: DT_STRING
shape: (-1)
name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
outputs['classes'] tensor_info:
dtype: DT_STRING
shape: (-1, 2)
name: head/Tile:0
outputs['scores'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 2)
name: head/predictions/probabilities:0
Method name is: tensorflow/serving/classify
signature_def['predict']:
The given SavedModel SignatureDef contains the following input(s):
inputs['examples'] tensor_info:
dtype: DT_STRING
shape: (-1)
name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
outputs['all_class_ids'] tensor_info:
dtype: DT_INT32
shape: (-1, 2)
name: head/predictions/Tile:0
outputs['all_classes'] tensor_info:
dtype: DT_STRING
shape: (-1, 2)
name: head/predictions/Tile_1:0
outputs['class_ids'] tensor_info:
dtype: DT_INT64
shape: (-1, 1)
name: head/predictions/ExpandDims:0
outputs['classes'] tensor_info:
dtype: DT_STRING
shape: (-1, 1)
name: head/predictions/str_classes:0
outputs['logistic'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: head/predictions/logistic:0
outputs['logits'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: linear/linear_model/linear/linear_model/linear/linear_model/weighted_sum:0
outputs['probabilities'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 2)
name: head/predictions/probabilities:0
Method name is: tensorflow/serving/predict
signature_def['regression']:
The given SavedModel SignatureDef contains the following input(s):
inputs['inputs'] tensor_info:
dtype: DT_STRING
shape: (-1)
name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
outputs['outputs'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: head/predictions/logistic:0
Method name is: tensorflow/serving/regress
signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['inputs'] tensor_info:
dtype: DT_STRING
shape: (-1)
name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
outputs['classes'] tensor_info:
dtype: DT_STRING
shape: (-1, 2)
name: head/Tile:0
outputs['scores'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 2)
name: head/predictions/probabilities:0
Method name is: tensorflow/serving/classify
看来您在输出的最后一部分中使用了saved_model_cli命令行工具。由此,您有了一个“预测”功能,该功能显示输入类型,列等。执行此操作时,我将看到所有输入列。在您的情况下,它仅显示一个输入,该输入是一个名为examples的字符串。这看起来不正确。
这里是$ saved_model_cli show --dir /somedir/export/exporter/123456789 --all
输出的摘录。在输出中,点显示删除的行,因为它们看起来很相似。
signature_def['predict']:
The given SavedModel SignatureDef contains the following input(s):
inputs['feature_num_1'] tensor_info:
dtype: DT_FLOAT
shape: (-1)
name: Placeholder_29:0
...
...
The given SavedModel SignatureDef contains the following output(s):
outputs['all_class_ids'] tensor_info:
dtype: DT_INT32
shape: (-1, 2)
name: dnn/head/predictions/Tile:0
outputs['all_classes'] tensor_info:
dtype: DT_STRING
shape: (-1, 2)
name: dnn/head/predictions/Tile_1:0
...
...
Method name is: tensorflow/serving/predict