Esta página describe cómo TF2 SavedModels para tareas relacionadas con imágenes debe implementar la API de SavedModel reutilizable . (Esto reemplaza las firmas comunes para imágenes para el formato TF1 Hub ahora obsoleto).
Vector de característica de imagen
Resumen de uso
Un vector de características de imagen es un tensor 1-D denso que representa una imagen completa, generalmente para uso de un clasificador de retroalimentación simple en el modelo de consumidor. (En términos de las CNN clásicas, este es el valor del cuello de botella después de que la extensión espacial se haya agrupado o aplanado, pero antes de realizar la clasificación; para eso, consulte la clasificación de imágenes a continuación).
Un modelo guardado reutilizable para la extracción de características de imágenes tiene un método __call__
en el objeto raíz que asigna un lote de imágenes a un lote de vectores de características. Se puede utilizar así:
obj = hub.load("path/to/model") # That's tf.saved_model.load() after download.
images = ... # A batch of images with shape [batch_size, height, width, 3].
features = obj(images) # A batch with shape [batch_size, num_features].
En Keras, el equivalente es
features = hub.KerasLayer("path/to/model")(images)
La entrada sigue la convención general para la entrada de imágenes . La documentación del modelo especifica el rango permitido para height
y width
de la entrada.
La salida es un tensor único de dtype float32
y forma [batch_size, num_features]
. El batch_size
es el mismo que en la entrada. num_features
es una constante específica del módulo independiente del tamaño de entrada.
Detalles de la API
La API reutilizable SavedModel también proporciona una lista de obj.variables
(por ejemplo, para la inicialización cuando no se carga con entusiasmo).
Un modelo que admite ajustes proporciona una lista de obj.trainable_variables
. Es posible que sea necesario aprobar training=True
para ejecutar en modo de entrenamiento (por ejemplo, para abandono). Algunos modelos permiten argumentos opcionales para anular hiperparámetros (por ejemplo, tasa de abandono; se describirá en la documentación del modelo). El modelo también puede proporcionar una lista de obj.regularization_losses
. Para obtener más información, consulte la API SavedModel reutilizable .
En Keras, hub.KerasLayer
se encarga de esto: inicialícelo con trainable=True
para permitir el ajuste fino y (en el raro caso de que se apliquen anulaciones de hparam) con arguments=dict(some_hparam=some_value, ...))
.
Notas
La aplicación de la exclusión a las funciones de salida (o no) debe dejarse en manos del consumidor del modelo. El SavedModel en sí no debería realizar el abandono en las salidas reales (incluso si utiliza el abandono internamente en otros lugares).
Ejemplos
Los modelos guardados reutilizables para vectores de características de imágenes se utilizan en
- el tutorial de Colab Reentrenamiento de un clasificador de imágenes ,
Clasificación de imágenes
Resumen de uso
La clasificación de imágenes asigna los píxeles de una imagen a puntuaciones lineales (logits) para pertenecer a las clases de una taxonomía seleccionada por el editor del módulo . Esto permite a los consumidores del modelo sacar conclusiones de la clasificación particular aprendida por el módulo del editor. (Para la clasificación de imágenes con un nuevo conjunto de clases, es común reutilizar un modelo de Vector de características de imagen con un nuevo clasificador).
Un modelo guardado reutilizable para la clasificación de imágenes tiene un método __call__
en el objeto raíz que asigna un lote de imágenes a un lote de logits. Se puede utilizar así:
obj = hub.load("path/to/model") # That's tf.saved_model.load() after download.
images = ... # A batch of images with shape [batch_size, height, width, 3].
logits = obj(images) # A batch with shape [batch_size, num_classes].
En Keras, el equivalente es
logits = hub.KerasLayer("path/to/model")(images)
La entrada sigue la convención general para la entrada de imágenes . La documentación del modelo especifica el rango permitido para height
y width
de la entrada.
Los logits
de salida son un tensor único de tipo d float32
y forma [batch_size, num_classes]
. El batch_size
es el mismo que en la entrada. num_classes
es el número de clases en la clasificación, que es una constante específica del modelo.
El valor logits[i, c]
es una puntuación que predice la pertenencia del ejemplo i
a la clase con índice c
.
Depende de la clasificación subyacente si estas puntuaciones están destinadas a usarse con softmax (para clases mutuamente excluyentes), sigmoide (para clases ortogonales) u otra cosa. La documentación del módulo debe describir esto y hacer referencia a una definición de los índices de clase.
Detalles de la API
La API reutilizable SavedModel también proporciona una lista de obj.variables
(por ejemplo, para la inicialización cuando no se carga con entusiasmo).
Un modelo que admite ajustes proporciona una lista de obj.trainable_variables
. Es posible que sea necesario aprobar training=True
para ejecutar en modo de entrenamiento (por ejemplo, para abandono). Algunos modelos permiten argumentos opcionales para anular hiperparámetros (por ejemplo, tasa de abandono; se describirá en la documentación del modelo). El modelo también puede proporcionar una lista de obj.regularization_losses
. Para obtener más información, consulte la API SavedModel reutilizable .
En Keras, hub.KerasLayer
se encarga de esto: inicialícelo con trainable=True
para permitir el ajuste fino y (en el raro caso de que se apliquen anulaciones de hparam) con arguments=dict(some_hparam=some_value, ...))
.
Entrada de imagen
Esto es común a todos los tipos de modelos de imágenes.
Un modelo que toma un lote de imágenes como entrada las acepta como un tensor 4-D denso de tipo d float32
y forma [batch_size, height, width, 3]
cuyos elementos son valores de color RGB de píxeles normalizados al rango [0, 1] . Esto es lo que obtienes de tf.image.decode_*()
seguido de tf.image.convert_image_dtype(..., tf.float32)
.
El modelo acepta cualquier batch_size
. La documentación del modelo especifica el rango permitido de height
y width
. La última dimensión está fijada a 3 canales RGB.
Se recomienda que los modelos utilicen el diseño de tensores channels_last
(o NHWC
) en todo momento y dejen que el optimizador de gráficos de TensorFlow lo reescriba en channels_first
(o NCHW
) si es necesario.