Как указать model.compile для binary_crossentropy, активация = сигмоид и активация = softmax? - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь выяснить, как сопоставить 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.

1 Ответ

1 голос
/ 01 мая 2019

Чтобы использовать 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 или сигмоид на последнем слое в сети, вам не нужно from_logits=True. Softmax и сигмоид выводят нормализованные значения между [0, 1], которые в данном контексте считаются вероятностями.

См. Этот вопрос для получения дополнительной информации: Что означает слово logits в TensorFlow?


Теперь, чтобы исправить проблему с 50% -ной точностью в softmax, измените следующий код с этого:

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

на это:

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

Помните, что когда вы используете softmax, вы выводите вероятность того, что пример принадлежит каждому классу. По этой причине вам нужна единица измерения для каждого возможного класса, которая в контексте двоичной классификации будет составлять 2 единицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...