OSTRZEŻENIE: przepływ tensorowy: tryby waga_próbki zostały wymuszone z… na [„…”]

47

Trenowanie klasyfikatora obrazów za pomocą .fit_generator()lub .fit()przekazywanie słownika class_weight=jako argumentu.

Nigdy nie dostałem błędów w TF1.x, ale w 2.1 dostaję następujące dane wyjściowe podczas rozpoczynania treningu:

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

Co to znaczy przymusić coś od ...do ['...']?

Źródło ostrzeżenia o tensorflowrepozytorium znajduje się tutaj , zamieszczono komentarze:

Próba wymuszenia sample_weight_modes na strukturze docelowej. Zależy to domyślnie od tego, że Model spłaszcza dane wyjściowe w celu ich wewnętrznej reprezentacji.

jorijnsmit
źródło
7
Zabawnie jest widzieć tak niedawne pytanie jako jedyny wynik wyszukiwania moich własnych ostrzeżeń.
jmkjaer,
1
@jorijnsmit czy możesz podać kod, aby odtworzyć problem / ostrzeżenie?
thushv89,
2
Właściwie przejście na TF2 z %tensorflow_version 2.xwystarczy, aby pojawiło się to ostrzeżenie: colab.research.google.com/gist/jorijnsmit/…
jorijnsmit
1
@ jorijnsmit, Nie, dostaję to samo ostrzeżenie, ale faktycznie zainstalowałem TF2.1 jako pip install tensorflow(w środowisku pyenv / virtualenv)
lurix66
1
Tak, rzeczywiście @ lurix66, wprowadzono kod, który generuje ten błąd 2.1.0rc0.
jorijnsmit

Odpowiedzi:

11

To wydaje się fałszywa wiadomość. Otrzymuję ten sam komunikat ostrzegawczy po aktualizacji do TensorFlow 2.1, ale nie używam żadnych wag klas ani próbek wzorcowych. Używam generatora, który zwraca krotkę taką jak ta:

return inputs, targets

A teraz zmieniłem to na następujące, aby ostrzeżenie zniknęło:

return inputs, targets, [None]

Nie wiem, czy to jest istotne, ale mój model wykorzystuje 3 dane wejściowe, więc moja inputszmienna jest tak naprawdę listą 3 tablic numpy. targetsjest tylko pojedynczą tablicą liczb.

W każdym razie to tylko ostrzeżenie. Trening działa dobrze tak czy inaczej.

Edycja dla TensorFlow 2.2:

Ten błąd wydaje się naprawiony w TensorFlow 2.2, co jest świetne. Jednak powyższa poprawka nie powiedzie się w TF 2.2, ponieważ spróbuje uzyskać kształt odważników próbki, co oczywiście nie powiedzie się AttributeError: 'NoneType' object has no attribute 'shape'. Więc cofnij powyższą poprawkę podczas aktualizacji do wersji 2.2.

jlh
źródło
To też działa dla mnie.
Robert Lugg,
14

Uważam, że jest to błąd związany z przepływem tensor, który wystąpi, gdy zadzwonisz model.compile()z parametrem domyślnym, sample_weight_mode=Nonea następnie zadzwonisz model.fit()z określonym sample_weightlub class_weight.

Z repozytoriów tensorflow:

  • fit() ostatecznie dzwoni _process_training_inputs()
  • _process_training_inputs() zestawy sample_weight_modes = [None] oparte na, model.sample_weight_mode = Nonea następnie tworzy DataAdapterzsample_weight_modes = [None]
  • że DataAdapterrozmowy broadcast_sample_weight_modes()z sample_weight_modes = [None]podczas inicjalizacji
  • broadcast_sample_weight_modes() wydaje się oczekiwać, sample_weight_modes = None ale odbiera[None]
  • zapewnia, że [None]jest to inna struktura niż sample_weight/ class_weight, zastępuje ją z powrotem None, dopasowując się do struktury sample_weight/ class_weighti wyświetla ostrzeżenie

Ostrzegając na bok, nie ma to wpływu na, fit()ponieważ sample_weight_modesw DataAdapterustawiono z powrotem na None.

Zauważ, że dokumentacja tensorflow stwierdza, że sample_weightmusi to być tablica numpy. Jeśli zadzwonisz fit()ze sample_weight.tolist()zamiast, nie dostaniesz ostrzeżenie, ale sample_weightjest cicho nadpisane do Nonekiedy _process_numpy_inputs()nazywa się przerób i odbiera sygnał wejściowy o długości większej niż jeden.

Max
źródło
1
Bardzo dokładne wyjaśnienie, dzięki. Jedyne, czego nie rozumiem, to to, że ostrzeżenie opisuje ...przymus [...], podczas gdy w twoim przypadku [None]jest zmuszony do None...
jorijnsmit
4

Wziąłem twój Gist i zainstalowałem Tensorflow 2.0 zamiast TFA i działał bez żadnego takiego ostrzeżenia.

Oto sedno pełnego kodu. Kod instalacji Tensorflow pokazano poniżej:

!pip install tensorflow==2.0

Zrzut ekranu udanego wykonania pokazano poniżej:

wprowadź opis zdjęcia tutaj

Aktualizacja: Ten błąd został naprawiony wTensorflow Version 2.2.

Obsługa Tensorflow
źródło
5
Dziękuję za odpowiedź. Masz rację, komunikat ostrzegawczy pojawia się dopiero w wersji 2.1.0rc0. Jednak obawiam się, że moje szczątki pytanie: „Co to znaczy zmusić coś od ...do ['...']?”
jorijnsmit,
3
Zauważyłem, że niektóre prawdopodobnie niezamierzone rzeczy zdarzają się wtedy, gdy są sample_weight_mode=Nonei target_structuresą typu dict, sample_weight_modeswtedy [None]i wyjątek broadcast_sample_weight_modesjest wychwytywany z powodu dict. Czy można to uznać za błąd?
Franz Knülle
2
Nie. Pytanie zbiera opinie i opinie, ale nie ma odpowiedzi.
jorijnsmit
1
@gkennos: Jeśli uważasz, że to błąd, czy możesz zgłosić błąd w repozytorium Github Tensorflow.
Wsparcie Tensorflow
1
Jest to z pewnością błąd, ale to już ustalona w TensorFlow 2.2
JLH
2

zamiast udostępniać słownik

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

próbowałem listę

weights = [42.0, 1.0]

i ostrzeżenie zniknęło.

0 -_- 0
źródło
Dzięki stary! Próbowałem (nie powiodło się) ze słownikami. Korzystając z listy, błąd został naprawiony!
Victor Mondejar-Guerra
Podczas gdy to pozbywa się błędu, dla mnie to łamanie wagi dla każdej klasy daje gorsze wyniki. Przed przejściem do listy sprawdziłbym spójność.
CanofDrink