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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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