Python >> Tutoriel Python >  >> Python Tag >> TensorFlow

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

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 aucune pondération de classe ni aucune pondération d'échantillon. J'utilise un générateur qui renvoie un tuple comme celui-ci :

return inputs, targets

Et maintenant, je viens de le remplacer par ce qui suit pour faire disparaître l'avertissement :

return inputs, targets, [None]

Je ne sais pas si c'est pertinent, mais mon modèle utilise 3 entrées, donc mon inputs variable est en fait une liste de 3 tableaux numpy. targets est juste un seul tableau numpy.

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

Modifier pour TensorFlow 2.2 :

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


Je crois que c'est un bogue 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_weight spécifié ou class_weight .

À partir des dépôts tensorflow :

  • fit() appelle finalement _process_training_inputs()
  • _process_training_inputs() définit sample_weight_modes = [None] basé sur model.sample_weight_mode = None puis crée un DataAdapter avec sample_weight_modes = [None]
  • le DataAdapter appelle le 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 que [None] est une structure différente de sample_weight / class_weight , le remplace par None en s'adaptant à la structure de sample_weight / class_weight et affiche un avertissement

Attention mis à part cela n'a aucun effet sur fit() comme sample_weight_modes dans le DataAdapter est remis à None .

Notez que la documentation de tensorflow indique que sample_weight doit être un tableau numérique. Si vous appelez le fit() avec sample_weight.tolist() à la place, vous ne recevrez pas d'avertissement mais sample_weight est silencieusement remplacé par None quand _process_numpy_inputs() est appelée en prétraitement et reçoit une entrée de longueur supérieure à un.


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 illustré ci-dessous :

!pip install tensorflow==2.0

La capture d'écran de l'exécution réussie est illustrée ci-dessous :

Mise à jour : Ce bogue est corrigé dans Tensorflow Version 2.2.