Отключение графика в выводе в Keras RNN + Encoder / Decoder + Внимание - PullRequest
1 голос
/ 14 марта 2019

Я успешно обучил модель в Керасе, используя структуру кодера / декодера + внимание + перчатку, следуя нескольким примерам, в частности этот и этот . Он основан на модификации машинного перевода. Это чатбот, поэтому ввод - это слова, а вывод - тоже. Тем не менее, я изо всех сил пытался правильно настроить логический вывод (прогноз) и не могу понять, как преодолеть отключение графа. Мой двунаправленный кодер-декодер RNN с встраиванием и вниманием тренируется нормально. Я пытался изменить декодер, но чувствую, что есть что-то очевидное, чего я не вижу.

Вот базовая модель:

from keras.models import Model
from keras.layers.recurrent import LSTM
from keras.layers import Dense, Input, Embedding, Bidirectional, RepeatVector, concatenate, Concatenate

## PARAMETERS
HIDDEN_UNITS = 100
encoder_max_seq_length = 1037 # maximum size of input sequence
decoder_max_seq_length = 187 # maximum size of output sequence
num_encoder_tokens = 6502 # a.k.a the size of the input vocabulary
num_decoder_tokens = 4802 # a.k.a the size of the output vocabulary

## ENCODER
encoder_inputs = Input(shape=(encoder_max_seq_length, ), name='encoder_inputs')
encoder_embedding = Embedding(input_dim = num_encoder_tokens, 
                              output_dim = HIDDEN_UNITS,
                              input_length = encoder_max_seq_length,
                              weights = [embedding_matrix],
                              name='encoder_embedding')(encoder_inputs)

encoder_lstm = Bidirectional(LSTM(units = HIDDEN_UNITS,
                                  return_sequences=True,
                                  name='encoder_lstm'))(encoder_embedding)
## ATTENTION
attention = AttentionL(encoder_max_seq_length)(encoder_lstm)
attention = RepeatVector(decoder_max_seq_length)(attention)

## DECODER
decoder_inputs = Input(shape = (decoder_max_seq_length, num_decoder_tokens),
                       name='decoder_inputs')

merge = concatenate([attention, decoder_inputs])

decoder_lstm = Bidirectional(LSTM(units = HIDDEN_UNITS*2,
                    return_sequences = True,
                    name='decoder_lstm'))(merge)

decoder_dense = Dense(units=num_decoder_tokens, 
                      activation='softmax', 
                      name='decoder_dense')(decoder_lstm)

decoder_outputs = decoder_dense

## Configure the model
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.load_weights('trained_models/viable-2/word-weights.h5')
encoder_model = Model(encoder_inputs, attention)
model.compile(loss='categorical_crossentropy', optimizer='adam')

Это выглядит так: введите описание изображения здесь

Вот где я сталкиваюсь с неприятностями:

## INFERENCE decoder setup
decoder_inputs_2 = Concatenate()([decoder_inputs, attention])
decoder_lstm = Bidirectional(LSTM(units=HIDDEN_UNITS*2, return_state = True, name='decoder_lstm'))
decoder_outputs, forward_h, forward_c, backward_h, backward_c= decoder_lstm(decoder_inputs_2)
state_h = Concatenate()([forward_h, backward_h])
state_c = Concatenate()([forward_c, backward_c])
decoder_states = [state_h, state_c]
decoder_dense = Dense(units=num_decoder_tokens, activation='softmax', name='decoder_dense')
decoder_outputs = decoder_dense(decoder_outputs)

decoder_model = Model([decoder_inputs, attention], [decoder_outputs] + decoder_states)

При этом возникает ошибка отключения графа: График отсоединен: невозможно получить значение для тензорного тензора ("encoder_inputs_61: 0", shape = (?, 1037), dtype = float32) на уровне "encoder_inputs". Следующие предыдущие слои были доступны без проблем: []

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

...