原始的MNIST示例使用单热编码来表示数据中的标签:这意味着,如果存在NLABELS = 10
类(如MNIST),则目标输出为[1 0 0 0 0 0 0 0 0 0]
对于类0,对于类[0 1 0 0 0 0 0 0 0 0]
, [0 1 0 0 0 0 0 0 0 0]
,等等tf.nn.softmax()
运算符将tf.matmul(x, W) + b
计算的对tf.matmul(x, W) + b
转换为概率分布跨不同的输出类别,然后将其与y_
的馈入值进行比较。
如果NLABELS = 1
,则这就像只有一个类,并且tf.nn.softmax()
op将为该类计算1.0
的概率,从而导致交叉熵为0.0
,因为tf.log(1.0)
对于所有示例, tf.log(1.0)
为0.0
。
您可以尝试(至少)两种方法进行二进制分类:
最简单的方法是为两个可能的类设置
NLABELS = 2
,然后将标签0的训练数据编码为[1 0]
,将标签[1 0]
训练数据编码为[0 1]
。 此答案对如何做到这一点提出了建议。您可以将标签保留为整数
0
和1
并使用tf.nn.sparse_softmax_cross_entropy_with_logits()
,如该答案所示 。
0
我正在尝试将此MNIST示例调整为二进制分类。
但是,当将我的
NLABELS
从NLABELS=2
更改为NLABELS=1
,损失函数始终返回0(精度为1)。我已经检查了
batch_ys
(送入y
)和_y
的尺寸,并且当NLABELS=1
时它们都是1xN矩阵,因此问题似乎NLABELS=1
。也许与矩阵乘法有关?我实际上在一个真实的项目中也遇到了同样的问题,因此,我们将不胜感激...谢谢!