当我打印预测结果时,输出包含3个不同的类别 0, 1, 和 2
,但我在训练集中只提供了2个不同的类别 0 和 1
。我不确定为什么会发生这种情况。我正在尝试扩展来自 TensorFlow 机器学习食谱 的教程。这是基于第2章的最后一个示例,如果有人有访问权限的话。请注意,其中有一些错误,但这可能是由于文本中较旧版本的不兼容性所致。
无论如何,我正在尝试在构建模型时建立一个非常严格的结构,以便我能将其牢记于心。我在每组计算的 tf.Session
之前预先实例化 tf.Graph
,并设置要使用的线程数。请注意,我使用的是 TensorFlow 1.0.1
和 Python 3.6.1
,所以如果您使用的是较旧版本的Python,f"formatstring{var}"
将无法工作。
让我感到困惑的是在 # Accuracy Predictions
部分的最后一步预测。**为什么我的分类结果有3个类别,我的准确率对于这样一个简单的分类任务来说如此低?** 我对这种基于模型的机器学习还比较新手,所以我确定这可能是我在语法上犯了错误或做了一些假设。**我的代码中是否有错误?**
...
输出结果:
...
回答:
你的模型不进行分类
你有一个线性回归模型,即你的输出变量(model = tf.multiply(pH_x, A))对每个输入输出一个具有任意范围的单一标量值。这通常是用于预测模型的,需要预测某个数值,而不是用于分类器的。
之后,你将其视为包含典型的n元分类器输出(例如,通过传递 sigmoid_cross_entropy_with_logits),但它不符合该函数的期望 – 在这种情况下,模型变量的“形状”应该是每个输入数据点有多个值(例如,在你的情况下是2个),每个值对应于每个类别的概率度量;然后通常传递给 softmax 函数以进行归一化处理。
或者,你可能想要一个二元分类器模型,根据类别输出单一值0或1 – 然而,在这种情况下,你需要在矩阵乘法之后使用类似逻辑函数的东西;并且这需要一个不同的损失函数,比如简单的均方差,而不是 sigmoid_cross_entropy_with_logits。
目前,模型的编写方式似乎是两个不同且不兼容的教程的混合体。