Tensorflow:从DNNClassifier打印预测变量时不支持的可调用错误

时间:2019-05-02 09:15:53

标签: python tensorflow machine-learning

我正在训练类似于mnist的数据集

系统:MacOS

Tensorflow版本:1.13.1(来自Anaconda)

x_trainx_testy_trainy_test是已经存在的熊猫数据框

我的代码:

import tensorflow as tf
feature_columns = [tf.feature_column.numeric_column("x", shape=[28 * 28])]

# DNN model for training
dnn_clf=tf.estimator.DNNClassifier(feature_columns=feature_columns,
                                            hidden_units=[300,100,20],
                                            n_classes=10)
input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": x_train.values}, y=y_train.values, num_epochs=5, batch_size=50, shuffle=True)

# Train the training set
dnn_clf.train(input_fn=input_fn)

# Predict the test set
pred_test=dnn_clf.predict(x_test.values)
print(list(pred_test))

我需要这些预测值而不是本教程中的dnn_clf.evaluate函数,因为我想对该模型进行混淆。

该错误发生在最后一行,部分错误消息如以下屏幕截图所示:

我得到的最后错误消息是:

TypeError: unsupported callable

enter image description here

那么如何在Tensorflow的DNNClassifier中正确获得预测值?

1 个答案:

答案 0 :(得分:0)

该错误发生在上述代码的“预测”部分,应该为:

test_value = tf.estimator.inputs.numpy_input_fn(
    x={"x": x_test}, y=None, batch_size=50, shuffle=True)
pred_test=dnn_clf.predict(input_fn=test_value)

它返回生成器而不是列表

所以获取预测值的方法是(也许不够正确,如果有什么问题,请告诉我)

1。将生成器转换为列表

pred_info=list(pred_test)

2。此列表中的每个元素如下所示:

{'logits': array([ -0.88073593,  -7.3466268 ,   3.0595555 ,   0.8544391 ,
          6.690731  , -12.812279  ,   7.951861  , -15.16283   ,
         -0.11098857, -12.9959545 ], dtype=float32),
 'probabilities': array([1.12913796e-04, 1.75649234e-07, 5.80756133e-03, 6.40212209e-04,
        2.19277114e-01, 7.42923278e-10, 7.73918152e-01, 7.08128972e-11,
        2.43805902e-04, 6.18264884e-10], dtype=float32),
 'class_ids': array([6]),
 'classes': array([b'6'], dtype=object)}

'class_ids'是我们想要的

此列表中的每个元素都是字典

像这样对列表中的每个元素使用dict_item_want.get()方法

dnn_test=[]
for i in pred_info:
    dnn_test.append(int(i.get('class_ids')))
print('the first 10 predictions from DNNClassifier are:')

您可以获得列表

3。将混淆矩阵应用于此列表和测试集中的y值