web-dev-qa-db-fra.com

Classification binaire Keras - Fonction d'activation sigmoïde

J'ai implémenté un MLP de base dans Keras avec tensorflow et j'essaie de résoudre un problème de classification binaire. Pour la classification binaire, il semble que sigmoïde soit la fonction d'activation recommandée et je ne comprends pas très bien pourquoi et comment Keras gère cela.

Je comprends que la fonction sigmoïde produira des valeurs comprises entre 0 et 1. Ma compréhension est que pour les problèmes de classification utilisant sigmoïde, il y aura un certain seuil utilisé pour déterminer la classe d'une entrée (généralement 0,5). Dans Keras, je ne vois aucun moyen de spécifier ce seuil, donc je suppose que cela se fait implicitement dans le back-end? Si tel est le cas, comment Keras fait-il la distinction entre l'utilisation de sigmoïde dans un problème de classification binaire ou un problème de régression? Avec la classification binaire, nous voulons une valeur binaire, mais avec la régression, une valeur nominale est nécessaire. Tout ce que je vois qui pourrait indiquer que c'est la fonction de perte. Est-ce que cela informe Keras sur la façon de gérer les données?

De plus, en supposant que Keras applique implicitement un seuil, pourquoi affiche-t-il des valeurs nominales lorsque j'utilise mon modèle pour prédire de nouvelles données?

Par exemple:

y_pred = model.predict(x_test)
print(y_pred)

donne:

[7.4706882e-02] [8.3481872e-01] [2.9314638e-04] [5.2297767e-03] [2.1608515e-01] ... [4.4894204e-03] [5.1120580e-05] [7.0263929e-04 ]

Je peux appliquer un seuil moi-même lors de la prédiction d'obtenir une sortie binaire, mais Keras doit sûrement le faire de toute façon afin de classer correctement? Peut-être que Keras applique un seuil lors de l'apprentissage du modèle, mais lorsque je l'utilise pour prédire de nouvelles valeurs, le seuil n'est pas utilisé car la fonction de perte n'est pas utilisée pour prédire? Ou n'applique-t-il pas un seuil du tout, et les valeurs nominales produites fonctionnent-elles bien avec mon modèle? J'ai vérifié que cela se produit sur l'exemple Keras pour la classification binaire, donc je ne pense pas avoir fait d'erreurs avec mon code, d'autant plus qu'il prédit avec précision.

Si quelqu'un pouvait expliquer comment cela fonctionne, je l'apprécierais grandement.

Voici mon modèle comme référence:

model = Sequential()
model.add(Dense(124, activation='relu', input_shape = (2,)))
model.add(Dropout(0.5))
model.add(Dense(124, activation='relu'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy',
              optimizer=SGD(lr = 0.1, momentum = 0.003),
              metrics=['acc'])

history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose=1,
                    validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
11
Daniel Whettam

La sortie d'une classification binaire est la probabilité qu'un échantillon appartienne à une classe.

comment Keras fait-il la distinction entre l'utilisation de sigmoïde dans un problème de classification binaire ou un problème de régression?

Il n'en a pas besoin. Il utilise la fonction de perte pour calculer la perte, puis les dérivés et mettre à jour les poids.

En d'autres termes:

  • Pendant la formation, le cadre minimise la perte. L'utilisateur doit spécifier la fonction de perte (fournie par le framework) ou fournir la sienne. Le réseau ne se soucie que de la valeur scalaire générée par cette fonction et ses 2 arguments sont prédits y^ et réel y.
  • Chaque fonction d'activation implémente les fonctions de propagation vers l'avant et de rétro-propagation. Le framework ne s'intéresse qu'à ces 2 fonctions. Peu importe ce que fait exactement la fonction. La seule exigence est que la fonction d'activation soit non linéaire.
5
Maxim Egorushkin