python - 如何为binary_crossentropy、activation=sigmoid和activation=softmax指定model.compile?

标签 python tensorflow keras loss-function activation-function

我正在尝试找出如何匹配 activation=sigmoidactivation=softmax正确的model.compile( )损失参数。特别是与 binary_crossentropy 相关的那些.

我研究了相关主题并阅读了文档。我还构建了一个模型并使其与 sigmoid 一起使用但不是softmax 。我无法让它与“from_logits ”参数正常工作。

具体来说,here它说:

Args:
  • from_logits: Whether output is expected to be a logits tensor. By default, we consider that output encodes a probability distribution.

这对我来说,如果你使用 sigmoid激活您想要的“from_logits=True”。对于softmax默认情况下您需要“from_logits=False”激活。这里我假设sigmoid提供logitssoftmax提供概率分布。

接下来是一些代码:

model = Sequential()
model.add(LSTM(units=128,
               input_shape=(n_timesteps, n_features), 
               return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(units=64, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(units=32))
model.add(Dropout(0.3))
model.add(Dense(16, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(1, activation='sigmoid'))

请注意,最后一行使用 sigmoid激活。然后:

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

这工作正常,但它使用默认的“from_logits=False”,它期望概率分布。

如果我执行以下操作,则会失败:

model.compile(optimizer=optimizer,
              loss='binary_crossentropy',  
              metrics=['accuracy'],
              from_logits=True) # For 'sigmoid' in above Dense

出现此错误消息:

ValueError: Invalid argument "from_logits" passed to K.function with TensorFlow backend

如果我尝试使用 softmax 激活:

model.add(Dense(1, activation='softmax'))

它可以运行,但我得到的准确度结果是 50%。与sigmoid我的准确率达到了+99%。 (我正在使用一个非常人为的数据集来调试我的模型,并且期望非常高的准确性。此外,它是一个非常小的数据集,并且会过度拟合,但目前还可以。)

所以我希望我应该能够在编译函数中使用“from_logits ”参数。但它不识别该参数。

我还想知道为什么它可以与 sigmoid 一起使用激活而不是 softmax激活以及如何让它与 softmax 一起工作激活。

谢谢,

乔恩。

最佳答案

要在损失函数中使用 from_logits,您必须将其传递到 BinaryCrossentropy对象初始化,不在模型编译中。

您必须更改此设置:

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

对此:

model.compile(optimizer=optimizer,
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),  
              metrics=['accuracy'])

但是,如果您在网络的最后一层使用 softmax 或 sigmoid,则不需要需要from_logits=True。 Softmax 和 sigmoid 输出 [0, 1] 之间的归一化值,在这种情况下被视为概率。

请参阅此问题了解更多信息:What is the meaning of the word logits in TensorFlow?

<小时/>

现在要解决 softmax 的 50% 准确度问题,请更改以下代码:

model.add(Dense(1, activation='softmax'))

对此:

model.add(Dense(2, activation='softmax'))  # number of units = number of classes

请记住,当您使用 softmax 时,您将输出属于每个类的示例的概率。因此,每个可能的类别都需要一个单位,在二元分类上下文中为 2 个单位。

关于python - 如何为binary_crossentropy、activation=sigmoid和activation=softmax指定model.compile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929401/

相关文章:

python - 使用随机森林对文本文档进行分类

python - 继承的 xpath 未显示 - Odoo v8

machine-learning - 使用 tensorflow 预测车祸

python - Keras - on_batch_end 方法很慢,但我只有回调是检查点

python - 检测扫描图像中的疟疾细胞

python - 我可以使用 Linux LiveCD 安装任何东西(比如 Python)吗?

python - 使用 Spark DataFrames 对多个字符串分类特征进行一次性编码

python - 根据 tensorflow 中的两列对张量进行排序

python - 理解 Tensorflow 中的 while 循环

python - keras 模型中的 fit_generator()