ATTENZIONE: tensorflow: le modalità sample_weight sono state forzate da ... a ['...']


47

Formazione di un classificatore di immagini utilizzando .fit_generator()o .fit()e passando un dizionario class_weight=come argomento.

Non ho mai avuto errori in TF1.x ma in 2.1 ottengo il seguente output quando inizio l'allenamento:

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

Cosa significa forzare qualcosa da ...a ['...']?

La fonte di questo avviso sul tensorflowrepository è qui , i commenti inseriti sono:

Tentativo di forzare sample_weight_modes nella struttura di destinazione. Ciò dipende implicitamente dal fatto che il Modello appiattisce gli output per la sua rappresentazione interna.


7
È divertente vedere una domanda così recente come l'unico risultato di ricerca anche per i miei avvertimenti.
jmkjaer,

1
@jorijnsmit puoi fornire il codice per replicare il problema / avviso?
thushv89,

2
Passare effettivamente a TF2 con %tensorflow_version 2.xè sufficiente per far apparire questo avviso: colab.research.google.com/gist/jorijnsmit/…
jorijnsmit

1
@jorijnsmit, No, ricevo lo stesso avviso ma in realtà ho installato TF2.1 come pip install tensorflow(nell'ambiente pyenv / virtualenv)
lurix66,

1
Sì davvero @ lurix66, viene introdotto il codice che genera questo errore 2.1.0rc0.
jorijnsmit il

Risposte:


11

Questo sembra un messaggio falso. Ricevo lo stesso messaggio di avviso dopo l'aggiornamento a TensorFlow 2.1, ma non utilizzo affatto pesi di classe o pesi di esempio. Uso un generatore che restituisce una tupla come questa:

return inputs, targets

E ora l'ho appena cambiato come segue per far sparire l'avvertimento:

return inputs, targets, [None]

Non so se questo è rilevante, ma il mio modello utilizza 3 input, quindi la mia inputsvariabile è in realtà un elenco di 3 array numpy. targetsè solo un singolo array numpy.

In ogni caso, è solo un avvertimento. La formazione funziona bene in entrambi i modi.

Modifica per TensorFlow 2.2:

Questo errore sembra essere stato corretto in TensorFlow 2.2, il che è fantastico. Tuttavia, la correzione di cui sopra fallirà in TF 2.2, perché cercherà di ottenere la forma dei pesi di esempio, che ovviamente fallirà AttributeError: 'NoneType' object has no attribute 'shape'. Quindi annulla la correzione precedente durante l'aggiornamento a 2.2.


Questo funziona anche per me.
Robert Lugg,

14

Credo che questo sia un bug con tensorflow che accadrà quando chiami model.compile()con il parametro predefinito sample_weight_mode=Nonee poi chiami model.fit()con specificato sample_weighto class_weight.

Dai repository tensorflow:

  • fit() alla fine chiama _process_training_inputs()
  • _process_training_inputs() imposta sample_weight_modes = [None] basato su model.sample_weight_mode = Nonee quindi crea un DataAdapterconsample_weight_modes = [None]
  • le DataAdapterchiamate broadcast_sample_weight_modes()con sample_weight_modes = [None]durante l' inizializzazione
  • broadcast_sample_weight_modes() sembra aspettarsi sample_weight_modes = None ma riceve[None]
  • asserisce che [None]è una struttura diversa da sample_weight/ class_weight, la sovrascrive Noneadattandola alla struttura di sample_weight/ class_weighte genera un avviso

Attenzione a parte questo non ha alcun effetto sul fit()come sample_weight_modesnella DataAdapterè arretrato a None.

Si noti che la documentazione di tensorflow afferma che sample_weightdeve essere un array numpy. Se invece chiami fit()con sample_weight.tolist(), non riceverai un avviso ma verrai sample_weightsovrascritto silenziosamente Nonequando _process_numpy_inputs()viene chiamato in preelaborazione e riceverà un input di lunghezza maggiore di uno.


1
Una spiegazione molto approfondita, grazie. L'unica cosa che non capisco è che l'avviso descrive di ...essere costretto a [...], mentre nel tuo caso [None]è costretto a None...
jorijnsmit

4

Ho preso il tuo Gist e installato Tensorflow 2.0, invece di TFA e ha funzionato senza tale avviso.

Ecco la sintesi del codice completo. Il codice per l'installazione di Tensorflow è mostrato di seguito:

!pip install tensorflow==2.0

La schermata dell'esecuzione corretta è mostrata di seguito:

inserisci qui la descrizione dell'immagine

Aggiornamento: questo errore è stato risolto inTensorflow Version 2.2.


5
Grazie per la vostra risposta. Hai ragione, il messaggio di avviso non viene introdotto fino alla versione 2.1.0rc0. Tuttavia, temo che la mia domanda rimanga: "Cosa significa forzare qualcosa da ...a ['...']?"
jorijnsmit,

3
Ho notato che alcune cose probabilmente non intenzionali accadono quando sample_weight_mode=Noneed target_structureè di tipo dict, sample_weight_modesè allora [None]e l'eccezione broadcast_sample_weight_modesè catturata a causa di dict. Questo può essere considerato un bug?
Franz Knülle,

2
No. La domanda continua a raccogliere punti di vista e valutazioni, ma nessuna risposta.
jorijnsmit,

1
@gkennos: se ritieni che si tratti di un bug, puoi presentare un bug nel repository Github Tensorflow.
Supporto Tensorflow,

1
E 'sicuramente un bug, ma è ora fissato in tensorflow 2.2
jlh

2

invece di fornire un dizionario

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

ho provato un elenco

weights = [42.0, 1.0]

e l'avvertimento è scomparso.


Grazie uomo! Stavo provando (senza successo) con i dizionari. Usando la lista l'errore è stato corretto!
Victor Mondejar-Guerra,

Mentre questo elimina l'errore, per me questo rompe la ponderazione per ogni classe produce risultati peggiori. Verificherei la coerenza prima di passare a un elenco.
CanofDrink,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.