【问题标题】:After running this following "Traininng Model" am getting this error运行以下“训练模型”后,出现此错误
【发布时间】:2020-06-02 11:57:45
【问题描述】:

创建此模型后,出现“不支持的可调用”错误。

    CATEGORICAL_COLUMNS = ['sex', 'n_siblings_spouses', 'parch', 'class', 'deck', 'embark_town', 'alone']
    NUMERIC_COLUMNS = ['age', 'fare']

    feature_columns = []
    for feature_name in CATEGORICAL_COLUMNS:
        vocabulary = dftrain[feature_name].unique()
        feature_columns.append(tf.feature_column.categorical_column_with_vocabulary_list(feature_name, vocabulary))

    for feature_name in NUMERIC_COLUMNS:
        feature_columns.append(tf.feature_column.numeric_column(feature_name, dtype = tf.float32))
    print(feature_columns)`enter code here`

    def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
      def input_function():
        ds=tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
        if shuffle:
            ds=ds.shuffle(1000)
        ds=ds.batch(batch_size).repeat(num_epochs)
        return ds
      return input_function()

    train_input_fn = make_input_fn(dftrain, y_train)
    eval_input_fn = make_input_fn(dfeval, y_eval, num_epochs=1, shuffle=False)

    linear_est = tf.estimator.LinearClassifier(feature_columns=feature_columns)

    linear_est.train(train_input_fn)  # train
    result = linear_est.evaluate(eval_input_fn)  # get model metrics/stats by testing on tetsing data

    clear_output()  # clears consoke output
    print(result['accuracy'])  # the result variable is simply a dict of stats about our model

错误:

TypeError: 不支持的可调用对象

【问题讨论】:

    标签: python tensorflow machine-learning deep-learning jupyter-notebook


    【解决方案1】:

    错误是因为访问Accuracy的正确键是accuracy(小写a)。

    为了了解发生了什么,您可以打印result 的值。

    如果我们执行命令print(result),输出将是

    {'accuracy': 0.7386364, 'accuracy_baseline': 0.625, 'auc': 0.83783287, 
        'auc_precision_recall': 0.78672063, 'average_loss': 0.47509083, 'label/mean': 0.375, 
        'loss': 0.46859953, 'precision': 0.64705884, 'prediction/mean': 0.39348394, 
    'recall': 0.6666667, 'global_step': 200}
    

    可以使用result['accuracy'] 访问准确性。

    完整的工作代码如下所示:

    import os
    import sys
    
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from IPython.display import clear_output
    from six.moves import urllib
    
    import tensorflow.compat.v2.feature_column as fc
    
    import tensorflow as tf
    
    # Load dataset.
    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']
    
    feature_columns = []
    for feature_name in CATEGORICAL_COLUMNS:
      vocabulary = dftrain[feature_name].unique()
      feature_columns.append(tf.feature_column.categorical_column_with_vocabulary_list(feature_name, vocabulary))
    
    for feature_name in NUMERIC_COLUMNS:
      feature_columns.append(tf.feature_column.numeric_column(feature_name, dtype=tf.float32))
    
    def make_input_fn(data_df, label_df, num_epochs=10, shuffle=True, batch_size=32):
      def input_function():
        ds = tf.data.Dataset.from_tensor_slices((dict(data_df), label_df))
        if shuffle:
          ds = ds.shuffle(1000)
        ds = ds.batch(batch_size).repeat(num_epochs)
        return ds
      return input_function
    
    train_input_fn = make_input_fn(dftrain, y_train)
    eval_input_fn = make_input_fn(dfeval, y_eval, num_epochs=1, shuffle=False)
    
    ds = make_input_fn(dftrain, y_train, batch_size=10)()
    for feature_batch, label_batch in ds.take(1):
      print('Some feature keys:', list(feature_batch.keys()))
      print()
      print('A batch of class:', feature_batch['class'].numpy())
      print()
      print('A batch of Labels:', label_batch.numpy())
    
    age_column = feature_columns[7]
    tf.keras.layers.DenseFeatures([age_column])(feature_batch).numpy()
    
    gender_column = feature_columns[0]
    tf.keras.layers.DenseFeatures([tf.feature_column.indicator_column(gender_column)])(feature_batch).numpy()
    
    linear_est = tf.estimator.LinearClassifier(feature_columns=feature_columns)
    linear_est.train(train_input_fn)
    result = linear_est.evaluate(eval_input_fn)
    
    clear_output()
    print(result)
    
    print(result['accuracy'])
    

    以上代码的输出为:

    {'accuracy': 0.7348485, 'accuracy_baseline': 0.625, 'auc': 0.8331497, 'auc_precision_recall': 0.7953714, 'average_loss': 0.47750932, 'label/mean': 0.375, 'loss': 0.47087723, 'precision': 0.6407767, 'prediction/mean': 0.4067955, 'recall': 0.6666667, 'global_step': 200}
    
    0.7348485
    

    更多详情请参考Tensorflow Tutorial on Estimator

    希望这会有所帮助。快乐学习!

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 2019-09-26
      相关资源
      最近更新 更多