Я пытаюсь понять, как сопоставить 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. с помощью бэкэнда TensorFlow
Если я попробую использовать активацию softmax как:
model.add(Dense(1, activation='softmax'))
Он работает, но я получаю результаты с точностью 50%. С sigmoid
я получаю + 99% точности. (Я использую очень надуманный набор данных для отладки своих моделей и ожидаю очень высокой точности. Кроме того, это очень маленький набор данных, и он будет слишком подходящим, но пока это нормально.)
Поэтому я ожидаю, что смогу использовать параметр «from_logits
» в функции компиляции. Но он не распознает этот параметр.
Также я хотел бы знать, почему он работает с sigmoid
активацией, а не с softmax
, и как мне заставить его работать с softmax
активацией.
Спасибо,
Джон.
keras.__version__
,tf.__version__
? Документы, которые вы цитируете, предназначены дляtf.__version__=='1.13.1'
. - person Vlad   schedule 01.05.2019