使用softmax作为输出函数,同时使用binary_crossentropy作为损失函数?

时间:2020-07-11 02:06:10

标签: python tensorflow machine-learning keras

目前,我正在训练二进制分类模型。我喜欢让两个概率加起来等于1(每个现有类一个)的想法。因此,我在输出层中使用了softmax并获得了很高的准确度(高达99.5%),损失也非常低为0,007。 经过研究,我发现在训练二维分类问题时,二元互熵是唯一的选择。

现在,当我想使用softmax时,如果必须使用category_crossentropy作为损失函数,我会感到困惑。您能否帮助我了解在二进制分类问题中应使用什么作为损失函数和激活函数?为什么?

这里是我的代码:

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim=input_dim, activation='sigmoid'))
model.add(tf.keras.layers.Dense(10, activation='sigmoid'))
model.add(tf.keras.layers.Dense(2, activation='softmax'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

2 个答案:

答案 0 :(得分:1)

  • 损失函数取决于问题类型。

    • 对于二进制分类问题-> binary_crossentropy

    • 对于多类别问题-> categoricol_crossentropy

    • 对于文本分类问题->计算MSE损失。

  • 激活功能还取决于问题类型。

    • 通常使用relu激活功能,但是对于二进制分类问题,有时tanh的性能更好。

我不建议使用sigmoid

对于优化程序,通常Adadelta的效果更好。

建议的原因是准确性指标。目的是达到高精度,因此您的模型必须处于学习状态。没有严格的规则,但是一些方法已被证明可以更好地发挥作用。

答案 1 :(得分:1)

因此,如果每个对象只能代表一个类,那么两者之间就没有区别

model.add(Dense(1, activation='sigmoid'))
loss = tf.keras.losses.BinaryCrossentropy()

model.add(Dense(2, activation='softmax'))
loss = tf.keras.losses.CategoricalCrossentropy()

here所述,二进制交叉熵只是分类交叉熵的一种情况。