python - 警告:tensorflow:输入图不使用 tf.data.Dataset 或包含 QueueRunner。这意味着永远预测收益率。这可能是一个错误
问题描述
早上好朋友,你好吗?我正在尝试导出我创建的神经网络(DNN 分类器),以使用它在另一个环境中进行预测。创建的神经网络如下:
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
import pandas as pd
import seaborn as sns
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import scikitplot as skplt
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv(r"", sep=";")
Y = df['plano'].values.astype('int')
X = df.drop(labels = ["plano"], axis=1).drop(labels = ["msisdn"], axis=1).astype('int')
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.20, random_state=42)
ax2 = sns.countplot(x=Y)
def input_fn(features, labels, training=True, batch_size= 256):
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
# Shuffle and repeat if you are in training mode.
if training:
dataset = dataset.shuffle(1000).repeat()
return dataset.batch(batch_size)
my_feature_columns = []
for key in X.keys():
my_feature_columns.append(tf.feature_column.numeric_column(key=key))
print(my_feature_columns)
classifier = tf.estimator.DNNClassifier(feature_columns=my_feature_columns,hidden_units=[784, 30, 10],n_classes=2)
classifier.train(input_fn=lambda: input_fn(X_train, Y_train, training=True), steps= 5000)
之后,我收到数据以获得如下预测:
df2 = pd.read_csv(r"", sep=",")
Y_2 = df2['plano'].values.astype('int')
X_2 = df2.drop(labels = ["plano"], axis=1).drop(labels = ["msisdn"], axis=1).astype('int')
pred_dicts = list(classifier.predict(input_fn=lambda: input_fn(X_2, Y_2, training=False)))
probs = round((1 - pd.Series([pred['probabilities'][1] for pred in pred_dicts]))*100,0)
print(probs)
我正在使用以下方法来保存程序:
tf.compat.v1.disable_eager_execution()
supervised_input_receiver_fn = (
tf.estimator.experimental.build_raw_supervised_input_receiver_fn(
{'cn': tf.compat.v1.placeholder(dtype=tf.int64, shape=[None]),
'pacote_codigo': tf.compat.v1.placeholder(dtype=tf.int64, shape=[None]),
'dias_base': tf.compat.v1.placeholder(dtype=tf.int64, shape=[None]),
'gasto_medio_mensal': tf.compat.v1.placeholder(dtype=tf.int64, shape=[None]),
'ticket_mensal': tf.compat.v1.placeholder(dtype=tf.int64, shape=[None])},
tf.compat.v1.placeholder(dtype=tf.float32, shape=[None])))
# During predict mode, expect to receive a `tf.Example` proto, so a parsing
# function is used.
serving_input_receiver_fn = (
tf.estimator.export.build_parsing_serving_input_receiver_fn(
tf.feature_column.make_parse_example_spec(my_feature_columns)))
# Option 1: Save all modes (train, eval, predict)
export_dir = classifier.experimental_export_all_saved_models(
'/tmp/export_all',
{tf.estimator.ModeKeys.TRAIN: supervised_input_receiver_fn,
tf.estimator.ModeKeys.EVAL: supervised_input_receiver_fn,
tf.estimator.ModeKeys.PREDICT: serving_input_receiver_fn})
classifier.export_saved_model("saves", serving_input_receiver_fn)
到目前为止,该程序运行良好。但是,当我尝试加载模型并在另一个程序中使用它时,我收到以下错误,阻止我做出预测:
警告:tensorflow:输入图不使用 tf.data.Dataset 或包含 QueueRunner。这意味着永远预测收益率。这可能是一个错误。
我正在加载模型如下:
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
import pandas as pd
import seaborn as sns
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
import scikitplot as skplt
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from tensorflow_estimator.python.estimator.canned import saved_model_estimator
import warnings
warnings.filterwarnings('ignore')
df2 = pd.read_csv(r"", sep=";")
Y_2 = df2['plano'].values.astype('int')
X_2 = df2.drop(labels = ["plano"], axis=1).drop(labels = ["msisdn"], axis=1).astype('int')
classifier = saved_model_estimator.SavedModelEstimator("saves/1618597001", "checkpoint")
def input_fn(features, labels, training=True, batch_size= 256):
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
# Shuffle and repeat if you are in training mode.
if training:
dataset = dataset.shuffle(1000).repeat()
return dataset.batch(batch_size)
my_feature_columns = []
for key in X_2.keys():
my_feature_columns.append(tf.feature_column.numeric_column(key=key))
print(my_feature_columns)
def predict_input_fn():
example = tf.train.Example()
example.features.feature['cn'].float_list.value.extend([3])
example.features.feature['pacote_codigo'].float_list.value.extend([2])
example.features.feature['dias_base'].float_list.value.extend([4])
example.features.feature['gasto_medio_mensal'].float_list.value.extend([5])
example.features.feature['ticket_mensal'].float_list.value.extend([5])
predict_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(x=X_2,num_epochs=1,shuffle=False)
return {'inputs':tf.constant([example.SerializeToString()])}
pred_dicts = list(classifier.predict(predict_input_fn))
probs = round((1 - pd.Series([pred['probabilities'][1] for pred in pred_dicts]))*100,0)
print(probs)
有谁知道如何解决这个问题?我查看了几个论坛,但到目前为止没有解决方案对我有帮助。我感谢您的帮助!