web-dev-qa-db-fra.com

Comment créer un calque de kéros avec un dégradé personnalisé dans TF2.0?

comme dans TensorFlow 2.0 ils prévoient d'unifier toutes les API de haut niveau sous keras (que je ne connais pas beaucoup) et de supprimer complètement les sessions, je me demandais:

Comment puis-je créer un calque de keras personnalisé avec un dégradé personnalisé?

J'ai vu le (assez limité) guide sur la création de couches personnalisées dans les keras mais il ne décrit pas ce que nous devons faire si nous voulons que notre opération ait un gradient personnalisé.

9
ILM91

Tout d'abord, "l'unification" des API (comme vous l'appelez) sous keras ne vous empêche pas de faire des choses comme vous le faisiez dans TensorFlow 1.x. Les sessions ont peut-être disparu, mais vous pouvez toujours définir votre modèle comme n'importe quelle fonction python et l'entraîner avec enthousiasme sans kéros (c'est-à-dire via tf.GradientTape )

Maintenant, si vous souhaitez créer un modèle de kéros avec une couche personnalisée qui effectue une opération personnalisée et a un dégradé personnalisé , vous devez procéder comme suit:

a) Écrivez une fonction qui exécute votre opération personnalisée et définissez votre dégradé personnalisé. Plus d'informations sur la façon de procéder ici .

@tf.custom_gradient
def custom_op(x):
    result = ... # do forward computation
    def custom_grad(dy):
        grad = ... # compute gradient
        return grad
    return result, custom_grad

Notez que dans la fonction, vous devez traiter x et dy comme des tenseurs et pas des tableaux numpy (c'est-à-dire effectuer des opérations de tenseur )

b) Créez une couche de keras personnalisée qui exécute votre custom_op. Pour cet exemple, je suppose que votre couche n'a pas de paramètres entraînables ou ne modifie pas la forme de son entrée, mais cela ne fait pas beaucoup de différence si c'est le cas. Pour cela, vous pouvez vous référer au guide que vous avez posté check celui-ci .

class CustomLayer(tf.keras.layers.Layer):
    def __init__(self):
        super(CustomLayer, self).__init__()

    def call(self, x):
        return custom_op(x)  # you don't need to explicitly define the custom gradient
                             # as long as you registered it with the previous method

Vous pouvez maintenant utiliser cette couche dans un modèle de kéros et cela fonctionnera. Par exemple:

inp = tf.keras.layers.Input(input_shape)
conv = tf.keras.layers.Conv2D(...)(inp)  # add params like the number of filters
cust = CustomLayer()(conv)  # no parameters in custom layer
flat = tf.keras.layers.Flatten()(cust)
fc = tf.keras.layers.Dense(num_classes)(flat)

model = tf.keras.models.Model(inputs=[inp], outputs=[fc])
model.compile(loss=..., optimizer=...)  # add loss function and optimizer
model.fit(...)  # fit the model
13
Djib2011