【发布时间】:2018-05-23 04:40:33
【问题描述】:
我正在尝试在 TensorFlow 中实现二进制分类器。如果我在最后一层有两个普通输出(即没有激活)并使用tf.losses.sparse_softmax_cross_entropy,我的网络会按预期进行训练。但是,如果我将输出层更改为使用tf.sigmoid 激活生成单个输出并使用tf.losses.log_loss 作为损失函数,我的网络不会训练(即损失/准确性没有提高)。
这是我的输出层/损失函数在第一个(即工作)案例中的样子:
out = tf.layers.dense(prev, 2)
loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=out)
在第二种情况下,我有以下内容:
out = tf.layers.dense(prev, 1, activation=tf.sigmoid)
loss = tf.losses.log_loss(labels=y, predictions=out)
张量y是0/1值的向量;它不是单热编码的。在第一种情况下,网络按预期学习,但在第二种情况下则不然。除了这两行之外,其他一切都保持不变。
我不明白为什么第二个设置不起作用。有趣的是,如果我在 Keras 中表达相同的网络并使用第二种设置,它就可以工作。在第二种情况下,我是否使用了错误的 TensorFlow 函数来表达我的意图?我想产生一个单一的 sigmoid 输出并使用二元交叉熵损失来训练一个简单的二元分类器。
我正在使用 Python 3.6 和 TensorFlow 1.4。
Here 是一个小型、可运行的 Python 脚本,用于演示该问题。请注意,您需要从 Kaggle 下载 StatOil/C-CORE 数据集才能按原样运行脚本。
谢谢!
【问题讨论】:
-
我也遇到了同样的问题。 Sigmoid 和 log_loss 在 keras 中有效,但在 tensorflow 中没有学习发生。但是, sparse_softmax_cross_entropy 似乎有效。你找出问题所在了吗?
-
很遗憾没有。我仍然有兴趣了解我们为什么会看到这个问题。
标签: machine-learning tensorflow classification