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 tensorflow
el 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.x
es 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
inputs
variable es en realidad una lista de 3 matrices numpy.targets
es 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=None
y luego llamemodel.fit()
con especificadosample_weight
oclass_weight
.Desde los repositorios de tensorflow:
fit()
eventualmente llama_process_training_inputs()
_process_training_inputs()
conjuntossample_weight_modes = [None]
basados enmodel.sample_weight_mode = None
y luego crea unDataAdapter
consample_weight_modes = [None]
DataAdapter
llamadasbroadcast_sample_weight_modes()
consample_weight_modes = [None]
durante la inicializaciónbroadcast_sample_weight_modes()
parece esperarsample_weight_modes = None
pero recibe[None]
[None]
es una estructura diferente desample_weight
/class_weight
, la sobrescribeNone
ajustando a la estructura desample_weight
/class_weight
y genera una advertenciaAdvertencia a un lado esto no tiene ningún efecto sobre
fit()
comosample_weight_modes
en elDataAdapter
se vuelve a establecerNone
.Tenga en cuenta que la documentación de tensorflow indica que
sample_weight
debe ser una matriz numpy. Si llamafit()
consample_weight.tolist()
, en su lugar, no recibirá una advertencia, perosample_weight
se sobrescribe en silencioNone
cuando_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=None
ytarget_structure
es de tipodict
,sample_weight_modes
es entonces[None]
y la excepciónbroadcast_sample_weight_modes
se detecta debido adict
. ¿Se puede considerar esto como un error?en lugar de proporcionar un diccionario
probé una lista
y la advertencia desapareció.
fuente