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.
python
tensorflow
keras
tensorflow2.0
tf.keras
jorijnsmit
fuente
fuente

%tensorflow_version 2.xes suficiente para que aparezca esta advertencia: colab.research.google.com/gist/jorijnsmit/…pip install tensorflow(dentro del entorno pyenv / virtualenv)2.1.0rc0.Respuestas:
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:
Y ahora acabo de cambiarlo a lo siguiente para que la advertencia desaparezca:
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.fuente
Creo que este es un error con tensorflow que sucederá cuando llame
model.compile()con el parámetro predeterminadosample_weight_mode=Noney luego llamemodel.fit()con especificadosample_weightoclass_weight.Desde los repositorios de tensorflow:
fit()eventualmente llama_process_training_inputs()_process_training_inputs()conjuntossample_weight_modes = [None]basados enmodel.sample_weight_mode = Noney luego crea unDataAdapterconsample_weight_modes = [None]DataAdapterllamadasbroadcast_sample_weight_modes()consample_weight_modes = [None]durante la inicializaciónbroadcast_sample_weight_modes()parece esperarsample_weight_modes = Nonepero recibe[None][None]es una estructura diferente desample_weight/class_weight, la sobrescribeNoneajustando a la estructura desample_weight/class_weighty genera una advertenciaAdvertencia a un lado esto no tiene ningún efecto sobre
fit()comosample_weight_modesen elDataAdapterse vuelve a establecerNone.Tenga en cuenta que la documentación de tensorflow indica que
sample_weightdebe ser una matriz numpy. Si llamafit()consample_weight.tolist(), en su lugar, no recibirá una advertencia, perosample_weightse sobrescribe en silencioNonecuando_process_numpy_inputs()se llama en el preprocesamiento y recibe una entrada de longitud mayor que uno.fuente
...ser coaccionado[...], mientras que en su caso[None]es coaccionado aNone...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:
La captura de pantalla de la ejecución exitosa se muestra a continuación:
Actualización: este error se corrigió en
Tensorflow Version 2.2.fuente
2.1.0rc0. Sin embargo, me temo que mi pregunta sigue siendo: "¿Qué significa coaccionar algo de...a['...']?"sample_weight_mode=Noneytarget_structurees de tipodict,sample_weight_modeses entonces[None]y la excepciónbroadcast_sample_weight_modesse detecta debido adict. ¿Se puede considerar esto como un error?en lugar de proporcionar un diccionario
probé una lista
y la advertencia desapareció.
fuente