如何为 binary_crossentropy、activation=sigmoid 和 activation=softmax 指定 model.compile?
How To specify model.compile for binary_crossentropy, activation=sigmoid and activation=softmax?
我正在尝试弄清楚如何将 activation=sigmoid
和 activation=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
提供 logits
并且 softmax
提供概率分布。
接下来是一些代码:
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 时,您输出的是示例属于每个 class 的概率。因此,每个可能的 class 都需要一个单位,在二进制 classification 上下文中将是 2 个单位。
我正在尝试弄清楚如何将 activation=sigmoid
和 activation=softmax
与正确的 model.compile(
) 损失参数相匹配。特别是与 binary_crossentropy
.
我研究了相关主题并阅读了文档。我还建立了一个模型并让它与 sigmoid
但不是 softmax
一起工作。而且我无法使用“from_logits
”参数使其正常工作。
具体来说,here 它表示:
Args:
from_logits
: Whetheroutput
is expected to be a logits tensor. By default, we consider thatoutput
encodes a probability distribution.
这告诉我,如果您使用 sigmoid
激活,您需要“from_logits=True
”。对于 softmax
激活,您默认需要“from_logits=False
”。这里我假设 sigmoid
提供 logits
并且 softmax
提供概率分布。
接下来是一些代码:
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 时,您输出的是示例属于每个 class 的概率。因此,每个可能的 class 都需要一个单位,在二进制 classification 上下文中将是 2 个单位。