从TensorFlow估计器模型(2.0)保存、加载和预测

从TensorFlow估计器模型(2.0)保存、加载和预测,tensorflow,Tensorflow,TF2中是否有序列化和还原Estimator模型的指南?该文档非常零散,大部分未更新为TF2。我还没有在任何地方看到一个清晰完整的例子,说明估计器被保存、从磁盘加载并用于根据新输入进行预测 TBH,这看起来有多复杂,我有点困惑。估计器被称为拟合标准模型的简单、相对高级的方法,但在生产中使用估计器的过程似乎非常神秘。例如,当我通过tf.saved\u model.load(export\u path)从磁盘加载一个模型时,我会得到一个AutoTrackable对象: 不清楚为什么我没有拿回我的估

TF2中是否有序列化和还原
Estimator
模型的指南?该文档非常零散,大部分未更新为TF2。我还没有在任何地方看到一个清晰完整的例子,说明
估计器被保存、从磁盘加载并用于根据新输入进行预测

TBH,这看起来有多复杂,我有点困惑。估计器被称为拟合标准模型的简单、相对高级的方法,但在生产中使用估计器的过程似乎非常神秘。例如,当我通过
tf.saved\u model.load(export\u path)
从磁盘加载一个模型时,我会得到一个
AutoTrackable
对象:

不清楚为什么我没有拿回我的
估计器。它看起来像是过去有一个有用的发声功能
tf.contrib.predictor.from_saved_model
,但由于
contrib
不见了,它似乎不再发挥作用(除了在TFLite中)


任何指针都会非常有用。如您所见,我有点迷路。

也许作者不再需要答案,但我可以使用TensorFlow 2.1保存并加载DNNClassifier

# training.py
from pathlib import Path
import tensorflow as tf

....
# Creating the estimator
estimator = tf.estimator.DNNClassifier(
    model_dir = <model_dir>,
    hidden_units = [1000, 500],
    feature_columns = feature_columns, # this is a list defined earlier
    n_classes = 2,
    optimizer = 'adam')

feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
export_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
servable_model_path = Path(estimator.export_saved_model(<model_dir>, export_input_fn).decode('utf8'))
print(f'Model saved at {servable_model_path}')
#training.py
从pathlib导入路径
导入tensorflow作为tf
....
#创建估计器
估算器=tf.estimator.DNNClassifier(
模型_dir=,
隐藏单位=[1000500],
feature_columns=feature_columns,#这是前面定义的列表
n_类=2,
优化器='adam')
feature\u spec=tf.feature\u column.make\u parse\u example\u spec(feature\u columns)
导出\u输入\u fn=tf.estimator.export.build\u解析\u服务\u输入\u接收器\u fn(功能\u规范)
servable\u model\u path=路径(估计器.导出\u保存的\u模型(,导出\u输入\u fn).解码('utf8'))
打印(f'Model保存在{servable_Model_path}'上)
对于加载,您找到了正确的方法,只需检索predict\u fn

#testing.py
导入tensorflow作为tf
作为pd进口熊猫
def预测输入(测试df):
''使用tf.train.Example()和tf.train.Features()转换数据帧''
示例=[]
....
返回tf.constant(示例)
test\u df=pd.read\u csv('test.csv',…)
#加载估计器
predict_fn=tf.saved_model.load().signatures['predict']
#预测
预测=预测(示例=预测输入(测试)

希望这也能帮助其他人(:

您查看了2.0中的文档了吗?它与“从TensorFlow 1.x导入保存的模型”部分不同适用于估计器,并解释如何获得可调用的,以使用
prune
评估模型。好的,这可能是混淆的一部分,因为我没有使用TensorFlow 1.x。在这些文档中,没有明确说明如何获得
估计器
(在我的例子中是
DNNRegression
)返回。可能是我在使用
Estimator
s进行我的尝试时犯了一个错误。也许我应该专门使用Keras接口。我只想生成一些模型,序列化它们,然后根据需要加载它们以进行预测。啊,所以你想检索实际的Estimator对象,而不仅仅是能够加载m建模并运行它,是吗?是的,似乎没有一个API来实现这一点,只是在一般情况下,或者对于…使用Keras更容易,如果你需要估计器接口,你可以。如果你只是重新创建同一个估计器(同一个模型,或者同一个带相同参数的罐装估计器),并重新使用相同的输出目录,它将重新加载并准备好使用
.predict
。如果您不想或没有源代码来重新创建相同的估算器,则保存的_model.load将为您提供一个可以查询的对象(用于预测)但是这个对象不会有估计器API。我确实完全放弃了使用估计器,但这对其他人来说将是一个有用的参考。我会接受答案。我不敢相信用当前的估计器API保存和加载模型这样简单的事情有多麻烦。相比之下,Pytorch是如此简单和直观。嘿@OmarContugno,你能详细说明一下如何使用tf.train.Example()和tf.train.Features()转换数据帧吗?
?我对你回答的这一步有困难。我使用了这里提供的代码:从
df-->tf.constant(示例)
# testing.py
import tensorflow as tf
import pandas as pd

def predict_input_fn(test_df):
    '''Convert your dataframe using tf.train.Example() and tf.train.Features()'''
    examples = []
    ....
    return tf.constant(examples)

test_df = pd.read_csv('test.csv', ...)

# Loading the estimator
predict_fn = tf.saved_model.load(<model_dir>).signatures['predict']
# Predict
predictions = predict_fn(examples=predict_input_fn(test_df))