Внимание в Керасе: Как добавить другой механизм внимания в Керас Плотный слой? - PullRequest
0 голосов
/ 09 апреля 2019

Я новичок в Keras и пытаюсь создать простой авто-кодер в Keras со слоями внимания:

Вот что я попробовал:

data = Input(shape=(w,), dtype=np.float32, name='input_da')
noisy_data = Dropout(rate=0.2, name='drop1')(data)

encoded = Dense(256, activation='relu',
            name='encoded1', **kwargs)(noisy_data)
encoded = Lambda(mvn, name='mvn1')(encoded)

encoded = Dense(128, activation='relu',
            name='encoded2', **kwargs)(encoded)

encoded = Lambda(mvn, name='mvn2')(encoded)
encoded = Dropout(rate=0.5, name='drop2')(encoded)


encoder = Model([data], encoded)
encoded1 = encoder.get_layer('encoded1')
encoded2 = encoder.get_layer('encoded2')


decoded = DenseTied(256, tie_to=encoded2, transpose=True,
            activation='relu', name='decoded2')(encoded)
decoded = Lambda(mvn, name='new_mv')(decoded)


decoded = DenseTied(w, tie_to=encoded1, transpose=True,
            activation='linear', name='decoded1')(decoded)

И это выглядит так:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
data (InputLayer)            (None, 2693)              0         
_________________________________________________________________
drop1 (Dropout)              (None, 2693)              0         
_________________________________________________________________
encoded1 (Dense)             (None, 256)               689664    
_________________________________________________________________
mvn1 (Lambda)                (None, 256)               0         
_________________________________________________________________
encoded2 (Dense)             (None, 128)               32896     
_________________________________________________________________
mvn2 (Lambda)                (None, 128)               0         
_________________________________________________________________
drop2 (Dropout)              (None, 128)               0         
_________________________________________________________________
decoded2 (DenseTied)         (None, 256)               256       
_________________________________________________________________
mvn3 (Lambda)                (None, 256)               0         
_________________________________________________________________
decoded1 (DenseTied)         (None, 2693)              2693      
=================================================================

Где я могу добавить слой внимания в этой модели? я должен добавить после первого encoded_output и перед вторым кодированным вводом?

encoded = Lambda(mvn, name='mvn1')(encoded)

    Here?

encoded = Dense(128, activation='relu',
            name='encoded2', **kwargs)(encoded)

и я собирался пройти через эту прекрасную библиотеку:

https://github.com/CyberZHG/keras-self-attention

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

Я пытался с очень простым вниманием:

encoded = Dense(256, activation='relu',
        name='encoded1', **kwargs)(noisy_data)


encoded = Lambda(mvn, name='mvn1')(encoded)

attention_probs = Dense(256, activation='softmax', name='attention_vec')(encoded)
attention_mul = multiply([encoded, attention_probs], name='attention_mul')
attention_mul = Dense(256)(attention_mul)

print(attention_mul.shape)

encoded = Dense(128, activation='relu',
        name='encoded2', **kwargs)(attention_mul)

это в нужном месте, и я могу добавить какой-либо другой механизм внимания с этой моделью?

1 Ответ

0 голосов
/ 17 июня 2019

Полагаю, то, что вы делаете, является правильным способом привлечения внимания, потому что само по себе внимание - это ничто иное, как визуализация в виде весов плотного слоя. Кроме того, я полагаю, что применение внимания сразу после кодировщика - правильная вещь, поскольку оно будет обращать внимание на наиболее «информативную» часть распределения данных, необходимую для вашей задачи.

...