ADVERTENCIA: tensorflow: los modos sample_weight fueron forzados de ... a ['...']

47

Entrenando un clasificador de imágenes usando .fit_generator()o .fit()y pasando un diccionario class_weight=como argumento.

Nunca recibí errores en TF1.x pero en 2.1 obtengo el siguiente resultado al comenzar el entrenamiento:

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

¿Qué significa coaccionar algo de ...a ['...']?

La fuente de esta advertencia en tensorflowel repositorio está aquí , los comentarios son:

Intente obligar a sample_weight_modes a la estructura de destino. Esto depende implícitamente del hecho de que Model aplana las salidas para su representación interna.

jorijnsmit
fuente
77
Es divertido ver una pregunta tan reciente como el único resultado de búsqueda para mis propias advertencias también.
jmkjaer
1
@jorijnsmit, ¿puede proporcionar el código para replicar el problema / advertencia?
thushv89
2
En realidad, cambiar a TF2 con %tensorflow_version 2.xes suficiente para que aparezca esta advertencia: colab.research.google.com/gist/jorijnsmit/…
jorijnsmit
1
@jorijnsmit, No, recibo la misma advertencia pero he instalado TF2.1 como pip install tensorflow(dentro del entorno pyenv / virtualenv)
lurix66
1
Sí, de hecho @ lurix66, se introduce el código que genera este error 2.1.0rc0.
jorijnsmit

Respuestas:

11

Esto parece un mensaje falso. Recibo el mismo mensaje de advertencia después de actualizar a TensorFlow 2.1, pero no uso ningún peso de clase o peso de muestra. Yo uso un generador que devuelve una tupla como esta:

return inputs, targets

Y ahora acabo de cambiarlo a lo siguiente para que la advertencia desaparezca:

return inputs, targets, [None]

No sé si esto es relevante, pero mi modelo usa 3 entradas, por lo que mi inputsvariable es en realidad una lista de 3 matrices numpy. targetses solo una sola matriz numpy.

En cualquier caso, es solo una advertencia. El entrenamiento funciona bien de cualquier manera.

Editar para TensorFlow 2.2:

Este error parece haberse solucionado en TensorFlow 2.2, lo cual es genial. Sin embargo, la solución anterior fallará en TF 2.2, porque intentará obtener la forma de los pesos de muestra, lo que obviamente fallará AttributeError: 'NoneType' object has no attribute 'shape'. Así que deshaga la corrección anterior al actualizar a 2.2.

jlh
fuente
Esto también funciona para mí.
Robert Lugg
14

Creo que este es un error con tensorflow que sucederá cuando llame model.compile()con el parámetro predeterminado sample_weight_mode=Noney luego llame model.fit()con especificado sample_weighto class_weight.

Desde los repositorios de tensorflow:

  • fit() eventualmente llama _process_training_inputs()
  • _process_training_inputs() conjuntos sample_weight_modes = [None] basados ​​en model.sample_weight_mode = Noney luego crea un DataAdapterconsample_weight_modes = [None]
  • las DataAdapterllamadas broadcast_sample_weight_modes()con sample_weight_modes = [None]durante la inicialización
  • broadcast_sample_weight_modes() parece esperar sample_weight_modes = None pero recibe[None]
  • afirma que [None]es una estructura diferente de sample_weight/ class_weight, la sobrescribe Noneajustando a la estructura de sample_weight/ class_weighty genera una advertencia

Advertencia a un lado esto no tiene ningún efecto sobre fit()como sample_weight_modesen el DataAdapterse vuelve a establecer None.

Tenga en cuenta que la documentación de tensorflow indica que sample_weightdebe ser una matriz numpy. Si llama fit()con sample_weight.tolist(), en su lugar, no recibirá una advertencia, pero sample_weightse sobrescribe en silencio Nonecuando _process_numpy_inputs()se llama en el preprocesamiento y recibe una entrada de longitud mayor que uno.

Max
fuente
1
Una explicación muy completa, gracias. Lo único que no entiendo es que la advertencia describe ...ser coaccionado [...], mientras que en su caso [None]es coaccionado a None...
jorijnsmit
4

Tomé su Gist e instalé Tensorflow 2.0, en lugar de TFA y funcionó sin ninguna advertencia.

Aquí está la esencia del código completo. El código para instalar el Tensorflow se muestra a continuación:

!pip install tensorflow==2.0

La captura de pantalla de la ejecución exitosa se muestra a continuación:

ingrese la descripción de la imagen aquí

Actualización: este error se corrigió enTensorflow Version 2.2.

Soporte Tensorflow
fuente
55
Gracias por su respuesta. Tienes razón, el mensaje de advertencia no se introduce hasta la versión 2.1.0rc0. Sin embargo, me temo que mi pregunta sigue siendo: "¿Qué significa coaccionar algo de ...a ['...']?"
jorijnsmit
3
Me di cuenta de que algunas cosas probablemente no intencionadas suceden cuando sample_weight_mode=Noney target_structurees de tipo dict, sample_weight_modeses entonces [None]y la excepción broadcast_sample_weight_modesse detecta debido a dict. ¿Se puede considerar esto como un error?
Franz Knülle
2
No La pregunta sigue reuniendo puntos de vista y votos, pero no hay respuestas.
jorijnsmit
1
@gkennos: Si cree que es un error, ¿puede presentar un error en el repositorio de Github Tensorflow?
Tensorflow Support
1
Definitivamente es un error, pero ahora está solucionado en TensorFlow 2.2
jlh
2

en lugar de proporcionar un diccionario

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

probé una lista

weights = [42.0, 1.0]

y la advertencia desapareció.

0 -_- 0
fuente
¡Gracias hombre! Estaba intentando (sin éxito) con los diccionarios. ¡Al usar la lista, el error se corrige!
Víctor Mondéjar-Guerra
Si bien esto elimina el error, para mí esto rompe la ponderación de cada clase y produce peores resultados. Comprobaría la coherencia antes de cambiar a una lista.
CanofDrink