Je suis en train de suivre une formation à la machine de reconnaissance des émotions vocales.

Je souhaite appliquer une couche d'attention au modèle. L'instruction page est difficile à comprendre.

def bi_duo_LSTM_model(X_train, y_train, X_test,y_test,num_classes,batch_size=68,units=128, learning_rate=0.005, epochs=20, dropout=0.2, recurrent_dropout=0.2):
    
    class myCallback(tf.keras.callbacks.Callback):

        def on_epoch_end(self, epoch, logs={}):
            if (logs.get('acc') > 0.95):
                print("\nReached 99% accuracy so cancelling training!")
                self.model.stop_training = True

    callbacks = myCallback()

    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout,return_sequences=True)))
    model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
    #     model.add(tf.keras.layers.Bidirectional(LSTM(32)))
    model.add(Dense(num_classes, activation='softmax'))

    adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
    RMSopt = tf.keras.optimizers.RMSprop(lr=learning_rate, rho=0.9, epsilon=1e-6)
    SGDopt = tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.9, decay=0.1, nesterov=False)

    model.compile(loss='binary_crossentropy',
                  optimizer=adamopt,
                  metrics=['accuracy'])

    history = model.fit(X_train, y_train,
                        batch_size=batch_size,
                        epochs=epochs,
                        validation_data=(X_test, y_test),
                        verbose=1,
                        callbacks=[callbacks])

    score, acc = model.evaluate(X_test, y_test,
                                batch_size=batch_size)

    yhat = model.predict(X_test)

    return history, yhat

Comment puis-je l'appliquer pour s'adapter à mon modèle?

Et use_scale, causal et dropout sont-ils tous les arguments ?

S'il y a un dropout dans attention layer, comment le traiter puisque nous avons dropout dans la couche LSTM ?

0
Leo 9 nov. 2020 à 10:53

1 réponse

Meilleure réponse

L'attention peut être interprétée comme une récupération vectorielle douce.

  • Vous disposez de vecteurs de requêtes. Pour chaque requête, vous souhaitez récupérer

  • valeurs, telles que vous en calculiez une pondérée,

  • où les poids sont obtenus en comparant une requête avec des clés (le nombre de clés doit être le même que le nombre de valeurs et souvent ce sont les mêmes vecteurs).

Dans les modèles séquence à séquence, la requête est l'état du décodeur et les clés et les valeurs sont les états du décodeur.

Dans la tâche de classification, vous n'avez pas une telle requête explicite. Le moyen le plus simple de contourner ce problème est de former une requête "universelle" qui est utilisée pour collecter des informations pertinentes à partir des états cachés (quelque chose de similaire à ce qui a été décrit à l'origine dans cet article).

Si vous abordez le problème comme un étiquetage de séquence, en attribuant une étiquette non pas à une séquence entière, mais à des pas de temps individuels, vous souhaiterez peut-être utiliser une couche auto-attentive à la place.

0
Jindřich 9 nov. 2020 à 09:34