Я пытаюсь выяснить, как сопоставить activation=sigmoid
и activation=softmax
с правильными model.compile(
) параметрами потерь. В частности те, которые связаны с binary_crossentropy
.
Я исследовал смежные темы и прочитал документы. Также я построил модель и заставил ее работать с sigmoid
, но не softmax
. И я не могу заставить его работать должным образом с параметрами "from_logits
".
В частности, здесь он говорит:
Args:
from_logits
: ожидается ли output
тензором логитов.
По умолчанию мы считаем, что 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: Неверный аргумент "from_logits" передан в K.function с бэкэндом TensorFlow
Если я попытаюсь использовать активацию softmax как:
model.add(Dense(1, activation='softmax'))
Он работает, но я получаю 50% результатов. С sigmoid
я получаю + 99% точности. (Я использую очень надуманный набор данных для отладки моих моделей и ожидаю очень высокой точности. Плюс это очень маленький набор данных, который будет соответствовать, но пока это нормально.)
Так что я ожидаю, что смогу использовать параметр "from_logits
" в функции компиляции. Но он не распознает этот параметр.
Также хотелось бы знать, почему он работает с активацией sigmoid
, а не с активацией softmax
, и как мне заставить его работать с активацией softmax
.
Спасибо,
Jon.