Trainieren eines Bildklassifikators unter Verwendung .fit_generator()
oder .fit()
Übergeben eines Wörterbuchs class_weight=
als Argument.
Ich habe in TF1.x nie Fehler bekommen, aber in 2.1 bekomme ich zu Beginn des Trainings die folgende Ausgabe:
WARNING:tensorflow:sample_weight modes were coerced from
...
to
['...']
Was bedeutet es, etwas von ...
bis zu erzwingen ['...']
?
Die Quelle für diese Warnung auf tensorflow
dem Repo ist hier . Kommentare sind:
Versuchen Sie, sample_weight_modes zur Zielstruktur zu zwingen. Dies hängt implizit davon ab, dass das Modell die Ausgaben für seine interne Darstellung abflacht.
python
tensorflow
keras
tensorflow2.0
tf.keras
jorijnsmit
quelle
quelle
%tensorflow_version 2.x
reicht aus, um diese Warnung anzuzeigenpip install tensorflow
(innerhalb der pyenv / virtualenv-Umgebung)2.1.0rc0
.Antworten:
Dies scheint eine falsche Nachricht zu sein. Nach dem Upgrade auf TensorFlow 2.1 wird dieselbe Warnmeldung angezeigt, ich verwende jedoch überhaupt keine Klassen- oder Stichprobengewichte. Ich benutze einen Generator, der ein Tupel wie dieses zurückgibt:
Und jetzt habe ich es einfach wie folgt geändert, damit die Warnung verschwindet:
Ich weiß nicht, ob dies relevant ist, aber mein Modell verwendet 3 Eingaben, sodass meine
inputs
Variable tatsächlich eine Liste von 3 Numpy-Arrays ist.targets
ist nur ein einzelnes Numpy-Array.In jedem Fall ist es nur eine Warnung. Das Training funktioniert so oder so gut.
Für TensorFlow 2.2 bearbeiten:
Dieser Fehler scheint in TensorFlow 2.2 behoben worden zu sein, was großartig ist. Die obige Korrektur schlägt jedoch in TF 2.2 fehl, da versucht wird, die Form der Probengewichte zu ermitteln, was offensichtlich fehlschlägt
AttributeError: 'NoneType' object has no attribute 'shape'
. Machen Sie das obige Update rückgängig, wenn Sie auf 2.2 aktualisieren.quelle
Ich glaube, dies ist ein Fehler mit Tensorflow, der auftritt, wenn Sie
model.compile()
mit Standardparameternsample_weight_mode=None
aufrufen und dannmodel.fit()
mit angegebenemsample_weight
oder aufrufenclass_weight
.Aus den Tensorflow-Repos:
fit()
ruft schließlich an_process_training_inputs()
_process_training_inputs()
setztsample_weight_modes = [None]
basierend aufmodel.sample_weight_mode = None
und erstellt dann einDataAdapter
mitsample_weight_modes = [None]
DataAdapter
Anrufebroadcast_sample_weight_modes()
mitsample_weight_modes = [None]
während der Initialisierungbroadcast_sample_weight_modes()
scheint zu erwartensample_weight_modes = None
, erhält aber[None]
[None]
es sich um eine andere Struktur alssample_weight
/ handeltclass_weight
, es wirdNone
durch Anpassen an die Struktur vonsample_weight
/ zurückgeschriebenclass_weight
und eine Warnung ausgegebenWarnung beiseite dies hat keine Auswirkung auf
fit()
wiesample_weight_modes
in der zurückgesetztDataAdapter
wirdNone
.Beachten Sie, dass in der Tensorflow- Dokumentation angegeben ist , dass
sample_weight
es sich um ein Numpy-Array handeln muss. Wenn Sie stattdessenfit()
mit anrufensample_weight.tolist()
, erhalten Sie keine Warnung, sondernsample_weight
werden stillschweigend überschrieben,None
wenn_process_numpy_inputs()
sie in der Vorverarbeitung aufgerufen werden und eine Eingabe mit einer Länge von mehr als eins erhalten.quelle
...
, gezwungen zu werden[...]
, während in Ihrem Fall[None]
gezwungen wird,None
...Ich habe Ihr Gist genommen und Tensorflow 2.0 anstelle von TFA installiert, und es hat ohne eine solche Warnung funktioniert.
Hier ist der Kern des vollständigen Codes. Der Code für die Installation des Tensorflow ist unten dargestellt:
Der Screenshot der erfolgreichen Ausführung ist unten dargestellt:
Update: Dieser Fehler wurde behoben
Tensorflow Version 2.2.
quelle
2.1.0rc0
. Ich fürchte jedoch, meine Frage bleibt: "Was bedeutet es, etwas von...
bis zu erzwingen['...']
?"sample_weight_mode=None
undtarget_structure
ist vom Typdict
,sample_weight_modes
dann[None]
und die Ausnahme inbroadcast_sample_weight_modes
wird aufgrund der gefangendict
. Kann dies als Fehler angesehen werden?anstatt ein Wörterbuch bereitzustellen
Ich habe eine Liste ausprobiert
und die Warnung verschwand.
quelle