API SavedModel communes pour les tâches d'image

Cette page décrit comment TF2 SavedModels pour les tâches liées aux images doit implémenter l' API Reusable SavedModel . (Cela remplace les signatures communes pour les images pour le format TF1 Hub désormais obsolète.)

Vecteur de caractéristique d'image

Résumé d'utilisation

Un vecteur de caractéristiques d'image est un tenseur 1D dense qui représente une image entière, généralement destiné à être utilisé par un simple classificateur à anticipation dans le modèle grand public. (En termes de CNN classiques, il s'agit de la valeur du goulot d'étranglement après que l'étendue spatiale a été regroupée ou aplatie, mais avant que la classification ne soit effectuée ; pour cela, voir la classification des images ci-dessous.)

Un SavedModel réutilisable pour l'extraction de caractéristiques d'image a une méthode __call__ sur l'objet racine qui mappe un lot d'images à un lot de vecteurs de caractéristiques. Il peut être utilisé comme ceci :

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].

A Keras, l'équivalent est

features = hub.KerasLayer("path/to/model")(images)

L'entrée suit la convention générale pour l'entrée d'images . La documentation du modèle spécifie la plage autorisée pour height et width de l'entrée.

La sortie est un seul tenseur de dtype float32 et shape [batch_size, num_features] . Le batch_size est le même que dans l'entrée. num_features est une constante spécifique au module indépendante de la taille de l'entrée.

Détails de l'API

L' API SavedModel réutilisable fournit également une liste d' obj.variables (par exemple, pour l'initialisation lorsque le chargement n'est pas rapide).

Un modèle qui prend en charge le réglage fin fournit une liste de obj.trainable_variables . Il se peut que vous deviez passer training=True pour exécuter en mode formation (par exemple, pour l'abandon). Certains modèles autorisent des arguments facultatifs pour remplacer les hyperparamètres (par exemple, le taux d'abandon ; à décrire dans la documentation du modèle). Le modèle peut également fournir une liste de obj.regularization_losses . Pour plus de détails, consultez l' API SavedModel réutilisable .

Dans Keras, ceci est pris en charge par hub.KerasLayer : initialisez-le avec trainable=True pour permettre le réglage fin, et (dans les rares cas où les remplacements de hparam s'appliquent) avec arguments=dict(some_hparam=some_value, ...)) .

Remarques

L'application de l'abandon aux caractéristiques de sortie (ou non) doit être laissée au consommateur du modèle. Le SavedModel lui-même ne doit pas effectuer d'abandon sur les sorties réelles (même s'il utilise l'abandon en interne à d'autres endroits).

Exemples

Des SavedModels réutilisables pour les vecteurs de caractéristiques d'image sont utilisés dans

Classification des images

Résumé d'utilisation

La classification des images associe les pixels d'une image à des scores linéaires (logits) d'appartenance aux classes d'une taxonomie sélectionnée par l'éditeur du module . Cela permet aux utilisateurs du modèle de tirer des conclusions de la classification particulière apprise par le module de l'éditeur. (Pour la classification d'images avec un nouvel ensemble de classes, il est courant de réutiliser un modèle Image Feature Vector avec un nouveau classificateur à la place.)

Un SavedModel réutilisable pour la classification d'images a une méthode __call__ sur l'objet racine qui mappe un lot d'images à un lot de logits. Il peut être utilisé comme ceci :

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].

A Keras, l'équivalent est

logits = hub.KerasLayer("path/to/model")(images)

L'entrée suit la convention générale pour l'entrée d'images . La documentation du modèle spécifie la plage autorisée pour height et width de l'entrée.

Le logits de sortie est un tenseur unique de dtype float32 et de forme [batch_size, num_classes] . Le batch_size est le même que dans l'entrée. num_classes est le nombre de classes dans la classification, qui est une constante spécifique au modèle.

La valeur logits[i, c] est un score prédisant l'appartenance de l'exemple i à la classe d'indice c .

Cela dépend de la classification sous-jacente si ces scores sont destinés à être utilisés avec softmax (pour les classes mutuellement exclusives), sigmoïde (pour les classes orthogonales) ou autre chose. La documentation du module doit décrire cela et faire référence à une définition des indices de classe.

Détails de l'API

L' API SavedModel réutilisable fournit également une liste d' obj.variables (par exemple, pour l'initialisation lorsque le chargement n'est pas rapide).

Un modèle qui prend en charge le réglage fin fournit une liste de obj.trainable_variables . Il se peut que vous deviez passer training=True pour exécuter en mode formation (par exemple, pour l'abandon). Certains modèles autorisent des arguments facultatifs pour remplacer les hyperparamètres (par exemple, le taux d'abandon ; à décrire dans la documentation du modèle). Le modèle peut également fournir une liste de obj.regularization_losses . Pour plus de détails, consultez l' API SavedModel réutilisable .

Dans Keras, ceci est pris en charge par hub.KerasLayer : initialisez-le avec trainable=True pour permettre le réglage fin, et (dans les rares cas où les remplacements de hparam s'appliquent) avec arguments=dict(some_hparam=some_value, ...)) .

Entrée d'image

Ceci est commun à tous les types de modèles d'image.

Un modèle qui prend un lot d'images en entrée les accepte comme un tenseur 4-D dense de dtype float32 et forme [batch_size, height, width, 3] dont les éléments sont des valeurs de couleur RVB de pixels normalisés à la plage [0, 1] . C'est ce que vous obtenez de tf.image.decode_*() suivi de tf.image.convert_image_dtype(..., tf.float32) .

Le modèle accepte n'importe quel batch_size . La documentation du modèle spécifie la plage autorisée pour height et width . La dernière dimension est fixée à 3 canaux RVB.

Il est recommandé que les modèles utilisent la disposition channels_last (ou NHWC ) des Tensors tout au long, et laissent à l'optimiseur graphique de TensorFlow le soin de réécrire dans channels_first (ou NCHW ) si nécessaire.