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)
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:
y^
et réel y
.