AVERTISSEMENT: tensorflow: les modes sample_weight ont été contraints de… à ['…']

47

Formation d'un classificateur d'images en utilisant .fit_generator()ou .fit()et en passant un dictionnaire à class_weight=comme argument.

Je n'ai jamais eu d'erreurs dans TF1.x mais en 2.1 j'obtiens la sortie suivante lors du démarrage de la formation:

WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']

Que signifie contraindre quelque chose de ...à ['...']?

La source de cet avertissement sur tensorflowle dépôt est ici , les commentaires placés sont:

Essayez de contraindre sample_weight_modes à la structure cible. Cela dépend implicitement du fait que le modèle aplatit les sorties pour sa représentation interne.

jorijnsmit
la source
7
C'est drôle de voir une question aussi récente comme le seul résultat de recherche pour mes propres avertissements.
jmkjaer
1
@jorijnsmit pouvez-vous fournir le code pour reproduire le problème / avertissement?
thushv89
2
Passer à TF2 avec %tensorflow_version 2.xsuffit pour faire apparaître cet avertissement: colab.research.google.com/gist/jorijnsmit/…
jorijnsmit
1
@jorijnsmit, Non, je reçois le même avertissement mais j'ai en fait installé TF2.1 comme pip install tensorflow(dans l'environnement pyenv / virtualenv)
lurix66
1
Oui en effet @ lurix66, le code qui génère cette erreur est introduit dans 2.1.0rc0.
jorijnsmit

Réponses:

11

Cela ressemble à un faux message. Je reçois le même message d'avertissement après la mise à niveau vers TensorFlow 2.1, mais je n'utilise aucun poids de classe ou exemple de poids. J'utilise un générateur qui renvoie un tuple comme celui-ci:

return inputs, targets

Et maintenant, je viens de le changer comme suit pour faire disparaître l'avertissement:

return inputs, targets, [None]

Je ne sais pas si cela est pertinent, mais mon modèle utilise 3 entrées, donc ma inputsvariable est en fait une liste de 3 tableaux numpy. targetsest juste un tableau numpy unique.

En tout cas, ce n'est qu'un avertissement. La formation fonctionne bien dans les deux cas.

Modifier pour TensorFlow 2.2:

Ce bug semble avoir été corrigé dans TensorFlow 2.2, ce qui est génial. Cependant, le correctif ci-dessus échouera dans TF 2.2, car il essaiera d'obtenir la forme des poids d'échantillonnage, qui échouera évidemment avec AttributeError: 'NoneType' object has no attribute 'shape'. Annulez donc le correctif ci-dessus lors de la mise à niveau vers 2.2.

jlh
la source
Cela fonctionne aussi pour moi.
Robert Lugg
14

Je crois que c'est un bug avec tensorflow qui se produira lorsque vous appelez model.compile()avec le paramètre par défaut sample_weight_mode=None, puis appelez model.fit()avec sample_weightou spécifié class_weight.

Depuis les dépôts tensorflow:

  • fit() appelle finalement _process_training_inputs()
  • _process_training_inputs() ensembles sample_weight_modes = [None] basés sur model.sample_weight_mode = Nonepuis crée un DataAdapteravecsample_weight_modes = [None]
  • les DataAdapterappels broadcast_sample_weight_modes()avec sample_weight_modes = [None]lors de l' initialisation
  • broadcast_sample_weight_modes() semble attendre sample_weight_modes = None mais reçoit[None]
  • il affirme qu'il [None]s'agit d'une structure différente de sample_weight/ class_weight, l'écrase Noneen s'adaptant à la structure de sample_weight/ class_weightet émet un avertissement

Attention à part cela n'a aucun effet fit()comme sample_weight_modesdans le DataAdapterest remis à None.

Notez que la documentation tensorflow indique qu'il sample_weightdoit s'agir d'un tableau numpy. Si vous appelez fit()avec à la sample_weight.tolist()place, vous n'obtiendrez pas d'avertissement mais vous serez sample_weightécrasé en silence Nonequand il _process_numpy_inputs()est appelé en prétraitement et reçoit une entrée de longueur supérieure à un.

Max
la source
1
Une explication très approfondie, merci. La seule chose que je ne comprends pas, c'est que l'avertissement décrit d' ...être contraint [...], alors que dans votre cas, il [None]est contraint de None...
jorijnsmit
4

J'ai pris votre Gist et installé Tensorflow 2.0, au lieu de TFA et cela a fonctionné sans un tel avertissement.

Voici l' essentiel du code complet. Le code d'installation de Tensorflow est indiqué ci-dessous:

!pip install tensorflow==2.0

Une capture d'écran de l'exécution réussie est présentée ci-dessous:

entrez la description de l'image ici

Mise à jour: ce bug est corrigé dansTensorflow Version 2.2.

Prise en charge de Tensorflow
la source
5
Merci pour votre réponse. Vous avez raison, le message d'avertissement n'est pas introduit avant la version 2.1.0rc0. Cependant, je crains que ma question demeure: "Que signifie contraindre quelque chose de ...à ['...']?"
jorijnsmit
3
J'ai remarqué que certaines choses probablement involontaires se produisent lorsque sample_weight_mode=Noneet target_structuresont de type dict, sample_weight_modesest alors [None]et l'exception broadcast_sample_weight_modesest interceptée en raison de la dict. Cela peut-il être considéré comme un bug?
Franz Knülle
2
Nan. La question continue de recueillir des vues et des votes positifs, mais aucune réponse.
jorijnsmit
1
@gkennos: Si vous pensez qu'il s'agit d'un bogue, pouvez-vous déposer un bogue dans le référentiel Github Tensorflow.
Prise en charge de Tensorflow le
1
Il est sans aucun doute un bug, mais il est maintenant fixé à tensorflow 2.2
JLH
2

au lieu de fournir un dictionnaire

weights = {'0': 42.0, '1': 1.0}

j'ai essayé une liste

weights = [42.0, 1.0]

et l'avertissement a disparu.

0 -_- 0
la source
Merci mec! J'essayais (sans succès) avec des dictionnaires. En utilisant la liste, l'erreur est corrigée!
Victor Mondejar-Guerra
Bien que cela supprime l'erreur, pour moi, cela rompt la pondération pour chaque classe, ce qui produit de moins bons résultats. Je vérifierais la cohérence avant de passer à une liste.
CanofDrink