TensorFlow 二元分类器输出3个类别的预测结果而不是2个?

当我打印预测结果时,输出包含3个不同的类别 0, 1, 和 2,但我在训练集中只提供了2个不同的类别 0 和 1。我不确定为什么会发生这种情况。我正在尝试扩展来自 TensorFlow 机器学习食谱 的教程。这是基于第2章的最后一个示例,如果有人有访问权限的话。请注意,其中有一些错误,但这可能是由于文本中较旧版本的不兼容性所致。

无论如何,我正在尝试在构建模型时建立一个非常严格的结构,以便我能将其牢记于心。我在每组计算的 tf.Session 之前预先实例化 tf.Graph,并设置要使用的线程数。请注意,我使用的是 TensorFlow 1.0.1Python 3.6.1,所以如果您使用的是较旧版本的Python,f"formatstring{var}" 将无法工作。

让我感到困惑的是在 # Accuracy Predictions 部分的最后一步预测。**为什么我的分类结果有3个类别,我的准确率对于这样一个简单的分类任务来说如此低?** 我对这种基于模型的机器学习还比较新手,所以我确定这可能是我在语法上犯了错误或做了一些假设。**我的代码中是否有错误?**

...

输出结果:

...

enter image description here


回答:

你的模型不进行分类

你有一个线性回归模型,即你的输出变量(model = tf.multiply(pH_x, A))对每个输入输出一个具有任意范围的单一标量值。这通常是用于预测模型的,需要预测某个数值,而不是用于分类器的。

之后,你将其视为包含典型的n元分类器输出(例如,通过传递 sigmoid_cross_entropy_with_logits),但它不符合该函数的期望 – 在这种情况下,模型变量的“形状”应该是每个输入数据点有多个值(例如,在你的情况下是2个),每个值对应于每个类别的概率度量;然后通常传递给 softmax 函数以进行归一化处理。

或者,你可能想要一个二元分类器模型,根据类别输出单一值0或1 – 然而,在这种情况下,你需要在矩阵乘法之后使用类似逻辑函数的东西;并且这需要一个不同的损失函数,比如简单的均方差,而不是 sigmoid_cross_entropy_with_logits。

目前,模型的编写方式似乎是两个不同且不兼容的教程的混合体。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注