88 votes

Est-ce que model.compile() initialise tous les poids et biais dans Keras (backend tensorflow) ?

Lorsque je commence la formation d'un modèle, il n'y a pas de modèle enregistré précédemment. Je peux utiliser model.compile() en toute sécurité. J'ai maintenant sauvegardé le modèle dans un h5 pour la formation continue en utilisant checkpoint .

Disons que je veux entraîner le modèle davantage. Je suis confus à ce stade : puis-je utiliser model.compile() ici ? Et doit-il être placé avant ou après le model = load_model() déclaration ? Si model.compile() réinitialise tous les poids et les biais, je devrais le placer avant model = load_model() déclaration.

Après avoir découvert quelques discussions, il me semble que model.compile() n'est nécessaire que lorsque je n'ai pas de modèle sauvegardé auparavant. Une fois le modèle sauvegardé, il n'est pas nécessaire d'utiliser la fonction model.compile() . Est-il vrai ou faux ? Et quand je veux prédire en utilisant le modèle entraîné, dois-je utiliser model.compile() avant de prédire ?

173voto

Daniel Points 2149

Quand l'utiliser ?

Si vous utilisez compile c'est sûrement après load_model() . Après tout, vous avez besoin d'un modèle pour compiler. (PS : load_model compile automatiquement le modèle avec l'optimiseur qui a été sauvegardé avec le modèle)

Qu'est-ce que compile faire ?

Compile définit le fonction de perte le optimiseur y el métriques . C'est tout.

Cela n'a rien à voir avec les poids et vous pouvez compiler un modèle autant de fois que vous le souhaitez sans causer de problème aux poids pré-entraînés.

Vous avez besoin d'un modèle compilé pour train (parce que la formation utilise la fonction de perte et l'optimiseur). Mais il n'est pas nécessaire de compiler un modèle pour la prédiction.

Avez-vous besoin d'utiliser compile plus d'une fois ?

Seulement si :

  • Vous voulez en changer un :
    • Fonction de perte
    • Optimiseur / Taux d'apprentissage
    • Métriques
    • El trainable propriété d'une couche
  • Vous avez chargé (ou créé) un modèle qui n'est pas encore compilé. Ou votre méthode de chargement/sauvegarde n'a pas pris en compte la compilation précédente.

Conséquences d'une nouvelle compilation :

Si vous compilez à nouveau un modèle, vous perdrez l'élément états de l'optimiseur .

Cela signifie que votre formation souffrira un peu au début jusqu'à ce qu'il ajuste le taux d'apprentissage, les momentums, etc. Mais il n'y a absolument aucun dommage aux poids (à moins, bien sûr, que votre taux d'apprentissage initial soit si important que la première étape de l'apprentissage modifie de façon sauvage les poids finement ajustés).

1 votes

Est-ce que l'utilisation perd tous les états de l'optimiseur après une recompilation, même si vous avez initialement enregistré le modèle avec include_optimizer=True ?

0 votes

Vous devez recompiler avec le même optimiseur... mais je ne suis pas sûr que ce soit possible.

1 votes

@DanielMöller : Est-ce que cela affecte model.outputs C'est-à-dire, après la compilation et avant la compilation, quelle est la différence entre les deux ? De plus, il serait formidable que vous puissiez expliquer l'utilisation de la fonction compile=False en load_model(model, compile=False/True) argument.

30voto

today Points 7336

N'oubliez pas que vous devez également compiler le modèle après avoir modifié l'attribut trainable d'une couche, par exemple lorsque vous voulez affiner un modèle comme celui-ci :

  1. charger le modèle VGG sans classificateur supérieur

  2. geler toutes les couches (c'est-à-dire trainable = False )

  3. ajouter quelques couches au sommet

  4. compiler et entraîner le modèle sur certaines données

  5. débloquer certaines des couches de VGG en fixant trainable = True

  6. compiler à nouveau le modèle (N'OUBLIEZ PAS CETTE ÉTAPE !)

  7. entraîner le modèle sur certaines données

1 votes

Quel serait le résultat de ne pas compiler le modèle après avoir changé l'indicateur d'entraînement d'une couche ?

1 votes

@Kake_Fisk La modification ne serait pas effective, c'est-à-dire que le statut d'aptitude à la formation de la couche resterait tel qu'il était avant la dernière modification. compile l'invocation de la méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X