【发布时间】:2019-09-19 14:45:53
【问题描述】:
我试图弄清楚如何将activation=sigmoid 和activation=softmax 与正确的model.compile() 损失参数相匹配。特别是与binary_crossentropy 相关的那些。
我研究了相关主题并阅读了文档。我还建立了一个模型并让它与sigmoid 一起工作,但不是softmax。而且我无法使用“from_logits”参数使其正常工作。
具体来说,here 它说:
参数:
from_logits:output是否预期为 logits 张量。 默认情况下,我们认为output对概率分布进行编码。
这告诉我,如果您使用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:使用 TensorFlow 后端传递给 K.function 的参数“from_logits”无效
如果我尝试使用 softmax 激活:
model.add(Dense(1, activation='softmax'))
它可以运行,但我得到了 50% 的准确度结果。使用sigmoid,我的准确率提高了 99%。 (我正在使用一个非常人为的数据集来调试我的模型,并且期望非常高的准确性。另外,它是一个非常小的数据集,并且会过度拟合,但目前还可以。)
所以我希望我应该能够在编译函数中使用“from_logits”参数。但它不识别该参数。
我还想知道为什么它可以与sigmoid 激活而不是softmax 激活一起使用,以及如何让它与softmax 激活一起使用。
谢谢,
乔恩。
【问题讨论】:
-
你的
keras.__version__、tf.__version__是什么?您引用的文档适用于tf.__version__=='1.13.1'。
标签: python tensorflow keras loss-function activation-function