【发布时间】:2021-03-04 22:48:48
【问题描述】:
我正在尝试在 TensorFlow 中使用 BoostedTreesClassifier 保存的模型,但我不知道如何使用加载的模型进行预测。我在这里使用来自tutorial 的示例代码。这是我正在使用的最小代码:
import pandas as pd
from matplotlib import pyplot as plt
import tensorflow as tf
tf.random.set_seed(123)
dftrain = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/train.csv')
dfeval = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/eval.csv')
y_train = dftrain.pop('survived')
y_eval = dfeval.pop('survived')
CATEGORICAL_COLUMNS = ['sex', 'n_siblings_spouses', 'parch', 'class', 'deck',
'embark_town', 'alone']
NUMERIC_COLUMNS = ['age', 'fare']
def one_hot_cat_column(feature_name, vocab):
return tf.feature_column.indicator_column(
tf.feature_column.categorical_column_with_vocabulary_list(feature_name,
vocab))
feature_columns = []
for feature_name in CATEGORICAL_COLUMNS:
# Need to one-hot encode categorical features.
vocabulary = dftrain[feature_name].unique()
feature_columns.append(one_hot_cat_column(feature_name, vocabulary))
for feature_name in NUMERIC_COLUMNS:
feature_columns.append(tf.feature_column.numeric_column(feature_name,
dtype=tf.float32))
NUM_EXAMPLES = len(y_train)
def make_input_fn(X, y, n_epochs=None, shuffle=True):
def input_fn():
dataset = tf.data.Dataset.from_tensor_slices((dict(X), y))
if shuffle:
dataset = dataset.shuffle(NUM_EXAMPLES)
# For training, cycle thru dataset as many times as need (n_epochs=None).
dataset = dataset.repeat(n_epochs)
# In memory training doesn't use batching.
dataset = dataset.batch(NUM_EXAMPLES)
return dataset
return input_fn
train_input_fn = make_input_fn(dftrain, y_train)
eval_input_fn = make_input_fn(dfeval, y_eval, shuffle=False, n_epochs=1)
n_batches = 1
est = tf.estimator.BoostedTreesClassifier(feature_columns,
n_batches_per_layer=n_batches)
est.train(train_input_fn, max_steps=100)
result = est.evaluate(eval_input_fn)
# Make predictions
pred_dicts = list(est.predict(eval_input_fn))
probs = pd.Series([pred['probabilities'][1] for pred in pred_dicts])
probs.plot(kind='hist', bins=20, title='predicted probabilities')
plt.show()
# Save model
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
saved_model_path = est.export_saved_model('saved_model', serving_input_receiver_fn)
# Load model
loaded_est = tf.saved_model.load(saved_model_path)
# How can I use loaded_est to make predictions?
# pred_dicts_using_loaded_model = list(loaded_est.predict(eval_input_fn))
# probs_using_loaded_model = pd.Series([pred['probabilities'][1] for pred in pred_dicts_using_loaded_model])
编辑:最后两行评论只是为了展示我最终想要实现的目标。它们不会正确运行,也不是因为loaded_est 是与est 不同类型的对象。我不知道如何像使用est 一样使用loaded_est 进行预测。我查看了用于保存和加载模型here 的文档,他们在图像上执行此操作,但我无法将其转换为该数据,其中输入只是一个向量(即来自dfeval DataFrame 的一行)。
【问题讨论】:
标签: python tensorflow machine-learning keras