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 tensorflow
repozytorium 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.
python
tensorflow
keras
tensorflow2.0
tf.keras
jorijnsmit
źródło
źródło
%tensorflow_version 2.x
wystarczy, aby pojawiło się to ostrzeżenie: colab.research.google.com/gist/jorijnsmit/…pip install tensorflow
(w środowisku pyenv / virtualenv)2.1.0rc0
.Odpowiedzi:
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:
A teraz zmieniłem to na następujące, aby ostrzeżenie zniknęło:
Nie wiem, czy to jest istotne, ale mój model wykorzystuje 3 dane wejściowe, więc moja
inputs
zmienna jest tak naprawdę listą 3 tablic numpy.targets
jest 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.źródło
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=None
a następnie zadzwoniszmodel.fit()
z określonymsample_weight
lubclass_weight
.Z repozytoriów tensorflow:
fit()
ostatecznie dzwoni_process_training_inputs()
_process_training_inputs()
zestawysample_weight_modes = [None]
oparte na,model.sample_weight_mode = None
a następnie tworzyDataAdapter
zsample_weight_modes = [None]
DataAdapter
rozmowybroadcast_sample_weight_modes()
zsample_weight_modes = [None]
podczas inicjalizacjibroadcast_sample_weight_modes()
wydaje się oczekiwać,sample_weight_modes = None
ale odbiera[None]
[None]
jest to inna struktura niżsample_weight
/class_weight
, zastępuje ją z powrotemNone
, dopasowując się do strukturysample_weight
/class_weight
i wyświetla ostrzeżenieOstrzegając na bok, nie ma to wpływu na,
fit()
ponieważsample_weight_modes
wDataAdapter
ustawiono z powrotem naNone
.Zauważ, że dokumentacja tensorflow stwierdza, że
sample_weight
musi to być tablica numpy. Jeśli zadzwoniszfit()
zesample_weight.tolist()
zamiast, nie dostaniesz ostrzeżenie, alesample_weight
jest cicho nadpisane doNone
kiedy_process_numpy_inputs()
nazywa się przerób i odbiera sygnał wejściowy o długości większej niż jeden.źródło
...
przymus[...]
, podczas gdy w twoim przypadku[None]
jest zmuszony doNone
...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:
Zrzut ekranu udanego wykonania pokazano poniżej:
Aktualizacja: Ten błąd został naprawiony w
Tensorflow Version 2.2.
źródło
2.1.0rc0
. Jednak obawiam się, że moje szczątki pytanie: „Co to znaczy zmusić coś od...
do['...']
?”sample_weight_mode=None
itarget_structure
są typudict
,sample_weight_modes
wtedy[None]
i wyjątekbroadcast_sample_weight_modes
jest wychwytywany z powodudict
. Czy można to uznać za błąd?zamiast udostępniać słownik
próbowałem listę
i ostrzeżenie zniknęło.
źródło