Как эффективно привлечь внимание с помощью длинной последовательности использования Keras - PullRequest
0 голосов
/ 03 мая 2019

В этой задаче у меня есть последовательность РНК длиной 1k +, и я хочу предсказать такую ​​же (1k +) последовательность, основанную на символах, что и вторичная структура.Поезд имеет 10к + последовательность.Тестовый набор имеет 16 последовательностей.Я использую seq2seq с моделью внимания для завершения этой работы.

Я делаю сеть из демо.демонстрационная ссылка: https://github.com/SNUDerek/kerasdemo-seq2seq-attention

...
seq_idxs, seq2idx, idx2seq = make_arrays(list_sequence, maxvocab=100, maxlen=fuck_var, padfrom = 'start')
str_idxs, str2idx, idx2str = make_arrays(list_structure, maxvocab=100, maxlen=fuck_var, padfrom = 'end')

# hyperparameters
SEQ_VOCAB  = len(seq2idx)      # how many unique words in the input language
SEQ_EMBED  = 300               # low long are the character vectors in our input embedding space
MAX_IN_LEN = seq_idxs.shape[1] # how long is the sentence vector

STR_VOCAB    = len(str2idx)    # how many unique words in the output language
STR_EMBED    = 300             # low long are the character vectors in our input embedding space
MAX_OUT_LEN  = str_idxs.shape[1]

# rnn size
HIDDEN_SIZE = 100              # how big is the recurrent cell
DROP_RATE   = 0.4             # what is our dropout frequency

# bidirectional encoder
encoder_input = Input(shape=(MAX_IN_LEN,), name='encoder_input')

# korean embedding layer and dropout
encoder_embed = Embedding(SEQ_VOCAB, SEQ_EMBED, mask_zero=True, name='encoder_embed')(encoder_input)
encoder_embed = Dropout(DROP_RATE)(encoder_embed)

# two-layer bidirectional LSTM with final states
# divide the HIDDEN_SIZE by two because this is TWO LSTMS stacked
encoder_hout1, fwd_h1, fwd_c1, bck_h1, bck_c1 = Bidirectional(LSTM(int(HIDDEN_SIZE/2), return_sequences=True, return_state=True), name='encoder_lstm1')(encoder_embed)
encoder_hout2, fwd_h2, fwd_c2, bck_h2, bck_c2 = Bidirectional(LSTM(int(HIDDEN_SIZE/2), return_sequences=True, return_state=True), name='encoder_lstm2')(encoder_hout1)

# state concatenation (h, c states for layers 1 and 2)
state_h1 = concatenate([fwd_h1, bck_h1])
state_c1 = concatenate([fwd_c1, bck_c1])
state_h2 = concatenate([fwd_h2, bck_h2])
state_c2 = concatenate([fwd_c2, bck_c2])

# decoder
decoder_input = Input(shape=(MAX_OUT_LEN,), name='decoder_input')

# english embedding layer and dropout
decoder_embed = Embedding(STR_VOCAB, STR_EMBED, mask_zero=True, name='decoder_embed')(decoder_input)
decoder_embed = Dropout(DROP_RATE)(decoder_embed)

# two-layer LSTM initialized with encoder states
decoder_hout1 = LSTM(HIDDEN_SIZE, return_sequences=True, name='decoder_lstm1')(decoder_embed, initial_state=[state_h1, state_c1])
decoder_hout2 = LSTM(HIDDEN_SIZE, return_sequences=True, name='decoder_lstm2')(decoder_hout1, initial_state=[state_h2, state_c2])

# Luong global dot attention
# score function from the Luong apper = dot
score     = dot([decoder_hout2, encoder_hout2], axes=[2, 2], name='attn_dotprod')
# turn score to "attention dist." for weighted sum
attention = Activation('softmax', name='attn_softmax')(score)

# do the attention-weighted sum using dot product
context   = dot([attention, encoder_hout2], axes=[2, 1], name='cont_dotprod')

# 'stacked' the context vector with the decoder guess == 'attention vector'
context   = concatenate([context, decoder_hout2], name='cont_concats')

# activation
context   = TimeDistributed(Dense(HIDDEN_SIZE*2, activation='tanh'), name='cont_dnstanh')(context)

# guess which english letter
output    = TimeDistributed(Dense(STR_VOCAB, activation='softmax'))(context)

# our model takes as input the encoder and decoder, and as target the shifted output we made
model = Model([encoder_input, decoder_input], [output])

# compile the model with defined optimizer and loss function
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')

def translate():
  ...
  for i in range(maxout-1):
    output, heatmap = heatmapmodel.predict([encoder_input, decoder_input])
    output = output.argmax(axis=2)
    decoder_input[:,i] = output[:,i]
  ...

В поезде Керас сказал, что потеря составляет 0,04, а обучение быстрое, но в прогнозе я потратил 3 часа на одно предсказание последовательности с RTX2060, и у результата было многоошибка.В течение долгого времени, я думаю, что есть цикл длины последовательности, делающий предсказание одного символа и возвращающий к входу декодера в функцию предикта.Но я понятия не имею, чтобы решить это.

...