Chronique de Keras pour TensorFlow



Traduction du guide de présentation de Tensorflow.org. Ce guide vous donnera les bases pour commencer avec Keras. La lecture dure 10 minutes.

Importer tf.keras


tf.keras est une implémentation de la spécification API TensorFlow Keras. Il s'agit d'une API de haut niveau pour la création et la formation de modèles qui inclut une prise en charge de première classe pour les fonctionnalités spécifiques à TensorFlow telles que l' exécution tf.data pipelines tf.data et les estimateurs . tf.keras facilite l'utilisation de TensorFlow sans sacrifier la flexibilité et les performances.

Pour commencer, importez tf.keras dans le cadre de votre configuration TensorFlow:

 from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf from tensorflow import keras 

tf.keras peut exécuter n'importe quel code compatible Keras, mais gardez à l'esprit:

  • La version de tf.keras dans la dernière version de TensorFlow peut ĂŞtre diffĂ©rente de la dernière version de keras dans PyPI. DĂ©couvrez tf.keras.__version__ .
  • Lorsque vous enregistrez des poids de modèle, tf.keras fait par dĂ©faut au format de point de contrĂ´le. Passez le save_format='h5' pour utiliser HDF5 (ou ajoutez l'extension .h5 au .h5 du fichier).

Construisez un modèle simple


Modèle séquentiel


Dans Keras, vous collectez des couches pour créer des modèles . Un modèle est un graphique de couches (généralement). Le type de modèle le plus courant est la pile de couches: tf.keras.Sequential model.

Nous construisons un réseau simple entièrement connecté (c'est-à-dire un perceptron multicouche):

 from tensorflow.keras import layers model = tf.keras.Sequential() #       64 : model.add(layers.Dense(64, activation='relu')) #   : model.add(layers.Dense(64, activation='relu')) #   softmax  10 : model.add(layers.Dense(10, activation='softmax')) 

Personnaliser les calques


De nombreuses variétés de couches tf.keras.layers sont tf.keras.layers . La plupart d'entre eux utilisent un constructeur d'arguments commun:

  • activation : dĂ©finit la fonction d'activation de la couche. Ce paramètre spĂ©cifie le nom de la fonction intĂ©grĂ©e ou de l'objet appelĂ©. Le paramètre n'a pas de valeur par dĂ©faut.
  • kernel_initializer et bias_initializer : schĂ©mas d'initialisation qui crĂ©ent des pondĂ©rations de couche (noyau et dĂ©calage). Ce paramètre peut ĂŞtre le nom ou l'objet appelĂ©. L'initialiseur par dĂ©faut est "Glorot uniform" .
  • kernel_regularizer et bias_regularizer : schĂ©mas de rĂ©gularisation ajoutĂ©s aux pondĂ©rations de couche (noyau et dĂ©calage), comme la rĂ©gularisation L1 ou L2. Par dĂ©faut, la rĂ©gularisation n'est pas dĂ©finie.

Les exemples suivants d'instances des couches `tf.keras.layers.Dense` utilisent des arguments de constructeur:

 #    : layers.Dense(64, activation='sigmoid') # : layers.Dense(64, activation=tf.keras.activations.sigmoid) #     L1   0.01    : layers.Dense(64, kernel_regularizer=tf.keras.regularizers.l1(0.01)) #     L2   0.01    : layers.Dense(64, bias_regularizer=tf.keras.regularizers.l2(0.01)) #        : layers.Dense(64, kernel_initializer='orthogonal') #        2.0: layers.Dense(64, bias_initializer=tf.keras.initializers.Constant(2.0)) 

Formation et Ă©valuation


Configuration de la formation


Une fois le modèle construit, configurez le processus d'apprentissage en appelant la méthode de compile :

 model = tf.keras.Sequential([ #     64   : layers.Dense(64, activation='relu', input_shape=(32,)), #  : layers.Dense(64, activation='relu'), #   softmax  10 : layers.Dense(10, activation='softmax')]) model.compile(optimizer=tf.keras.optimizers.Adam(0.01), loss='categorical_crossentropy', metrics=['accuracy']) 

tf.keras.Model.compile accepte trois arguments importants:

  • optimizer : cet objet dĂ©finit la procĂ©dure de formation. tf.keras.optimizers instances d' tf.keras.optimizers module tf.keras.optimizers , telles que tf.keras.optimizers.Adam ou tf.keras.optimizers.SGD . Si vous souhaitez simplement utiliser les options par dĂ©faut, vous pouvez Ă©galement spĂ©cifier des optimiseurs avec des mots clĂ©s tels que 'adam' ou 'sgd' .
  • loss : il s'agit d'une fonction qui est minimisĂ©e dans le processus d'apprentissage. Parmi les variations courantes figurent l'erreur standard ( mse ), categorical_crossentropy , binary_crossentropy . Les fonctions de perte sont spĂ©cifiĂ©es par nom ou en passant l'objet appelĂ© Ă  partir du module tf.keras.losses .
  • metrics : utilisĂ©es pour surveiller la formation. Ce sont des noms de chaĂ®ne ou des objets appelĂ©s du module tf.keras.metrics .
  • De plus, pour vous assurer que le modèle est formĂ© et Ă©valuĂ© avec impatience, vĂ©rifiez que vous transmettez le paramètre run_eagerly=True au compilateur

Ensuite, nous allons voir quelques exemples de configuration de modèle pour la formation:

 #       . model.compile(optimizer=tf.keras.optimizers.Adam(0.01), loss='mse', # mean squared error metrics=['mae']) # mean absolute error #     . model.compile(optimizer=tf.keras.optimizers.RMSprop(0.01), loss=tf.keras.losses.CategoricalCrossentropy(), metrics=[tf.keras.metrics.CategoricalAccuracy()]) 

Apprendre des données NumPy


Pour les jeux de données plus petits, utilisez les matrices de mémoire de NumPy pour former et évaluer le modèle. Le modèle est «formé» sur les données de formation en utilisant la méthode «fit»:

 import numpy as np data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) model.fit(data, labels, epochs=10, batch_size=32) 

tf.keras.Model.fit prend trois arguments importants:

  • epochs : L'apprentissage se dĂ©compose en * Ă©poques *. L'ère est une itĂ©ration sur toutes les donnĂ©es d'entrĂ©e (cela se fait en petits lots).
  • batch_size : lors de la transmission de donnĂ©es NumPy, le modèle dĂ©compose les donnĂ©es en blocs plus petits (lots) et itère sur ces blocs pendant la formation. Ce nombre indique la taille de chaque bloc de donnĂ©es. N'oubliez pas que le dernier bloc peut ĂŞtre plus petit si le nombre total d'enregistrements n'est pas divisĂ© par la taille du lot.
  • validation_data : lors du prototypage d'un modèle, vous souhaitez suivre facilement ses performances sur les donnĂ©es de validation. La transmission d'un tuple de donnĂ©es d'entrĂ©e et d'Ă©tiquettes avec cet argument permet au modèle d'afficher les valeurs de la fonction de perte et des mĂ©triques en mode de sortie pour les donnĂ©es transmises Ă  la fin de chaque ère.

Voici un exemple utilisant validation_data :

 import numpy as np data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) val_data = np.random.random((100, 32)) val_labels = np.random.random((100, 10)) model.fit(data, labels, epochs=10, batch_size=32, validation_data=(val_data, val_labels)) 

Formation à l'aide des jeux de données tf.data


Utilisez l'API Datasets pour mettre à l'échelle de grandes bases de données ou vous entraîner sur plusieurs appareils. Passez l'instance de `tf.data.Dataset` à la méthode fit :

 #    : dataset = tf.data.Dataset.from_tensor_slices((data, labels)) dataset = dataset.batch(32) model.fit(dataset, epochs=10) 

Étant donné que l'ensemble de Dataset fournit des données par lots, ce morceau de code ne nécessite pas l'argument batch_size .

Les jeux de données peuvent également être utilisés pour valider:

 dataset = tf.data.Dataset.from_tensor_slices((data, labels)) dataset = dataset.batch(32) val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels)) val_dataset = val_dataset.batch(32) model.fit(dataset, epochs=10, validation_data=val_dataset) 

Évaluation et prédiction


Les tf.keras.Model.predict tf.keras.Model.evaluate et tf.keras.Model.predict peuvent utiliser les tf.data.Dataset NumPy et tf.data.Dataset .

Voici comment vous pouvez estimer les pertes en mode de sortie et les métriques pour les données fournies:

 #   Numpy data = np.random.random((1000, 32)) labels = np.random.random((1000, 10)) model.evaluate(data, labels, batch_size=32) #   dataset = tf.data.Dataset.from_tensor_slices((data, labels)) dataset = dataset.batch(32) model.evaluate(dataset) 

Et voici comment prédire la sortie du dernier niveau en mode de sortie pour les données fournies sous forme de tableau NumPy:

Construire des modèles complexes


L'API fonctionnelle


Le modèle tf.keras.Sequential est une simple pile de couches avec laquelle vous ne pouvez pas imaginer un modèle arbitraire. Utilisez l'API fonctionnelle Keras pour créer des topologies de modèle complexes, telles que:

  • Modèles Ă  entrĂ©es multiples
  • Modèles Ă  sorties multiples,
  • Modèles Ă  couches communes (la mĂŞme couche est appelĂ©e plusieurs fois),
  • Modèles avec des flux de donnĂ©es incohĂ©rents (par exemple, relations rĂ©siduelles).

La construction d'un modèle avec une API fonctionnelle fonctionne comme suit:

  1. L'instance de couche est appelable et renvoie un tenseur.
  2. Les tenseurs d'entrée et de sortie sont utilisés pour déterminer l'instance de tf.keras.Model
  3. Ce modèle est entraîné comme le modèle `Sequential`.

L'exemple suivant utilise l'API fonctionnelle pour créer un réseau simple et entièrement connecté:

 inputs = tf.keras.Input(shape=(32,)) #    #        . x = layers.Dense(64, activation='relu')(inputs) x = layers.Dense(64, activation='relu')(x) predictions = layers.Dense(10, activation='softmax')(x) 

Créez une instance du modèle avec ces entrées et sorties.

 model = tf.keras.Model(inputs=inputs, outputs=predictions) #     . model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001), loss='categorical_crossentropy', metrics=['accuracy']) #   5  model.fit(data, labels, batch_size=32, epochs=5) 

Modèles de sous-classement


Créez un modèle entièrement personnalisable en utilisant le sous- tf.keras.Model et en définissant votre propre distribution directe. Créez des couches dans la méthode __init__ et définissez-les en tant qu'attributs de l'instance de classe. Définissez la propagation directe dans la méthode d' call .

La sous-classification d'un modèle est particulièrement utile lorsque l'exécution rapide est activée, car elle vous permet d'écrire impérativement la distribution directe.

Remarque: si vous souhaitez que votre modèle s'exécute toujours impérativement, vous pouvez définir dynamic=True lorsque vous appelez le super constructeur.
Point clé: utilisez la bonne API pour travailler. Bien que la sous-classification d'un modèle offre une flexibilité, vous devez payer pour cela avec une plus grande complexité et un plus grand potentiel d'erreurs personnalisées. Si possible, choisissez l'API fonctionnelle.
L'exemple suivant montre un modèle tf.keras.Model sous-classé utilisant une distribution directe personnalisée, qui n'est pas obligatoire:

 class MyModel(tf.keras.Model): def __init__(self, num_classes=10): super(MyModel, self).__init__(name='my_model') self.num_classes = num_classes #    . self.dense_1 = layers.Dense(32, activation='relu') self.dense_2 = layers.Dense(num_classes, activation='sigmoid') def call(self, inputs): #     , #      ( `__init__`). x = self.dense_1(inputs) return self.dense_2(x) 

Créez une instance de la nouvelle classe de modèle:

 model = MyModel(num_classes=10) #     . model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001), loss='categorical_crossentropy', metrics=['accuracy']) #   5 . model.fit(data, labels, batch_size=32, epochs=5) 

Couches personnalisées


Créez un calque personnalisé en sous- tf.keras.layers.Layer et en appliquant les méthodes suivantes:

  • __init__ : spĂ©cifiez Ă©ventuellement les sous-couches Ă  utiliser dans cette couche.
  • * build : crĂ©er des poids de couche. Ajouter des poids Ă  l'aide de la mĂ©thode add_weight
  • call : dĂ©finir la distribution directe.
  • Facultativement, la couche peut ĂŞtre sĂ©rialisĂ©e en implĂ©mentant la mĂ©thode get_config et la mĂ©thode de la classe from_config .

Voici un exemple d'une couche utilisateur qui multiplie la matrice ( matmul ) alimentée à l'entrée avec la matrice du noyau:

 class MyLayer(layers.Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(MyLayer, self).__init__(**kwargs) def build(self, input_shape): #       . self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim), initializer='uniform', trainable=True) def call(self, inputs): return tf.matmul(inputs, self.kernel) def get_config(self): base_config = super(MyLayer, self).get_config() base_config['output_dim'] = self.output_dim return base_config @classmethod def from_config(cls, config): return cls(**config) 

Créez un modèle en utilisant votre couche personnalisée:

 model = tf.keras.Sequential([ MyLayer(10), layers.Activation('softmax')]) #      model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001), loss='categorical_crossentropy', metrics=['accuracy']) #   5 . model.fit(data, labels, batch_size=32, epochs=5) 

Kolbeki


Kolbek est un objet transféré au modèle pour personnaliser et élargir son comportement lors de l'entraînement. Vous pouvez écrire votre propre rappel personnalisé ou utiliser le tf.keras.callbacks qui comprend:

tf.keras.callbacks.ModelCheckpoint : enregistrement des points d'arrêt du modèle à intervalles réguliers.
tf.keras.callbacks.LearningRateScheduler : modifiez dynamiquement l'Ă©tape d'apprentissage.
tf.keras.callbacks.EarlyStopping : arrêt de la formation lorsque le résultat de la validation cesse de s'améliorer.
tf.keras.callbacks.TensorBoard: Surveillance du comportement du modèle à l'aide
Tensorboard

Pour utiliser tf.keras.callbacks.Callback , passez-le à la méthode d' fit modèle:

 callbacks = [ #    `val_loss`     2  tf.keras.callbacks.EarlyStopping(patience=2, monitor='val_loss'), #   TensorBoard   `./logs` directory tf.keras.callbacks.TensorBoard(log_dir='./logs') ] model.fit(data, labels, batch_size=32, epochs=5, callbacks=callbacks, validation_data=(val_data, val_labels)) 

Sauvegarde et restauration


Enregistrer uniquement les valeurs de poids


Enregistrez et chargez les poids du modèle à l'aide de tf.keras.Model.save_weights :

 model = tf.keras.Sequential([ layers.Dense(64, activation='relu', input_shape=(32,)), layers.Dense(10, activation='softmax')]) model.compile(optimizer=tf.keras.optimizers.Adam(0.001), loss='categorical_crossentropy', metrics=['accuracy']) 

 #     TensorFlow Checkpoint model.save_weights('./weights/my_model') #    #        . model.load_weights('./weights/my_model') 

Par défaut, les poids du modèle sont enregistrés au format de point de contrôle TensorFlow. Les poids peuvent également être enregistrés au format Keras HDF5 (valeur par défaut pour l'implémentation universelle Keras):

 #     HDF5 model.save_weights('my_model.h5', save_format='h5') #    model.load_weights('my_model.h5') 

Enregistrement de la configuration du modèle uniquement


La configuration du modèle peut être enregistrée - cela sérialise l'architecture du modèle sans aucun poids. Une configuration enregistrée peut restaurer et initialiser le même modèle, même sans code définissant le modèle d'origine. Keras prend en charge les formats de sérialisation JSON et YAML:

 #     JSON json_string = model.to_json() json_string 

 import json import pprint pprint.pprint(json.loads(json_string)) 

Restauration d'un modèle (réinitialisé) à partir de JSON:

 fresh_model = tf.keras.models.model_from_json(json_string) 

La sérialisation du modèle en YAML nécessite l'installation de `pyyaml` avant d'importer TensorFlow :

 yaml_string = model.to_yaml() print(yaml_string) 

Restauration d'un modèle à partir de YAML:

 fresh_model = tf.keras.models.model_from_yaml(yaml_string) 

Remarque: les modèles sous-classés ne sont pas sérialisables, car leur architecture est définie par du code Python dans le corps de la méthode `call`.

Enregistrement du modèle entier dans un fichier


Le modèle entier peut être enregistré dans un fichier contenant les valeurs des poids, la configuration du modèle et même la configuration de l'optimiseur. Cela vous permettra de définir un point d'arrêt du modèle et de poursuivre la formation ultérieurement à partir exactement de la même position, même sans accès au code source.

 #    model = tf.keras.Sequential([ layers.Dense(10, activation='softmax', input_shape=(32,)), layers.Dense(10, activation='softmax') ]) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(data, labels, batch_size=32, epochs=5) #      HDF5 model.save('my_model.h5') #         . model = tf.keras.models.load_model('my_model.h5') 

Exécution désireuse


L'exécution désireuse est un environnement de programmation impératif qui effectue des opérations immédiatement. Ceci n'est pas requis pour Keras, mais est pris en charge par tf.keras et est utile pour vérifier votre programme et déboguer.

Tous les modèles de construction de l'API `tf.keras` sont compatibles avec une exécution rapide. Bien que les API `séquentielles et fonctionnelles puissent être utilisées, une exécution rapide est particulièrement utile lors de la sous-classification d'un modèle et de la création de couches personnalisées - ces API nécessitent que vous écriviez une distribution directe sous forme de code (au lieu des API qui créent des modèles en assemblant des couches existantes).

Distribution


Plusieurs GPU


tf.keras modèles tf.keras peuvent être exécutés sur plusieurs GPU à l'aide de tf.distribute.Strategy . Cette API fournit un apprentissage distribué sur plusieurs GPU sans pratiquement modifier le code existant.

Actuellement, tf.distribute.MirroredStrategy seule stratégie de distribution prise en charge. MirroredStrategy réplique les graphiques avec
apprentissage synchrone à l'aide de la réduction totale sur une seule machine. Pour utiliser ` distribute.Strategy , imbriquez l'installation, la conception et la compilation de l'optimiseur dans le .scope() Strategy .scope() `, puis entraînez le modèle.

L'exemple suivant distribue tf.keras.Model entre plusieurs GPU sur la mĂŞme machine.

Tout d'abord, nous définissons un modèle dans le domaine d'une stratégie distribuée:

 strategy = tf.distribute.MirroredStrategy() with strategy.scope(): model = tf.keras.Sequential() model.add(layers.Dense(16, activation='relu', input_shape=(10,))) model.add(layers.Dense(1, activation='sigmoid')) optimizer = tf.keras.optimizers.SGD(0.2) model.compile(loss='binary_crossentropy', optimizer=optimizer) model.summary() 

Ensuite, nous formons le modèle sur les données comme d'habitude:

 x = np.random.random((1024, 10)) y = np.random.randint(2, size=(1024, 1)) x = tf.cast(x, tf.float32) dataset = tf.data.Dataset.from_tensor_slices((x, y)) dataset = dataset.shuffle(buffer_size=1024).batch(32) model.fit(dataset, epochs=1) 

Après vérification, la traduction apparaîtra également sur Tensorflow.org. Si vous souhaitez participer à la traduction de la documentation du site Tensorflow.org en russe, veuillez nous contacter à titre personnel ou commentaires. Toutes corrections ou commentaires sont appréciés.

Source: https://habr.com/ru/post/fr482126/


All Articles