Как применить слой внимания к модели LSTM

#python #tensorflow #keras #attention-model

#питон #тензорный поток #keras #внимание-модель #python

Вопрос:

Я занимаюсь обучением машины распознавания речевых эмоций.

Я хочу применить слой внимания к модели. Страница инструкций сложна для понимания.

 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

  

Как я могу применить его, чтобы он соответствовал моей модели?

И есть use_scale , causal и dropout все аргументы?

Если есть dropout in attention layer , как мы с этим справляемся, поскольку у нас есть dropout слой in LSTM?

Ответ №1:

Внимание можно интерпретировать как мягкое извлечение вектора.

  • У вас есть несколько векторов запросов. Для каждого запроса вы хотите получить некоторые

  • значения, такие, что вы вычисляете взвешенное из них,

  • где веса получаются путем сравнения запроса с ключами (количество ключей должно совпадать с количеством значений, и часто они являются одними и теми же векторами).

В последовательных моделях запрос — это состояние декодера, а ключи и значения — состояния декодера.

В задаче классификации у вас нет такого явного запроса. Самый простой способ обойти это — обучить «универсальный» запрос, который используется для сбора релевантной информации из скрытых состояний (что-то похожее на то, что было первоначально описано в этой статье).

Если вы подходите к проблеме как к маркировке последовательности, назначая метку не всей последовательности, а отдельным временным шагам, вы можете вместо этого использовать слой самоконтроля.

Комментарии:

1. Спасибо, я просмотрел несколько видеороликов о внимании к себе. Есть ли какой-либо учебник или хорошие примеры кодов, которые можно сослаться на мой случай? Или необходимо создавать коды на основе математики?