首页 > 解决方案 > 警告: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)

有谁知道如何解决这个问题?我查看了几个论坛,但到目前为止没有解决方案对我有帮助。我感谢您的帮助!

标签: pythontensorflow

解决方案


推荐阅读