keras - встраивание слоя mask_zero, вызывающее исключение на последующих слоях - PullRequest
1 голос
/ 17 апреля 2019

Я работаю над моделью на основе этой бумаги и получаю исключение из-за того, что слой GlobalMaxPooling1D не поддерживает маскирование.

У меня есть слой Embedding с аргументом mask_zero, установленным на True. Однако, поскольку последующий слой GlobalMaxPooling1D не поддерживает маскирование, я получаю исключение. Ожидается исключение, поскольку в документации фактически указано, что любые последующие слои после слоя Embedding с mask_zero = True должны поддерживать маскирование .

Однако, так как я обрабатываю предложения с переменным количеством слов в них, мне нужно маскирование в слое Embedding. (т.е. из-за разной длины ввода) Мой вопрос заключается в том, как мне изменить мою модель, чтобы маскирование оставалось частью модели и не вызывало проблем на уровне GlobalMaxPooling1D?

Ниже приведен код модели.

model = Sequential()
embedding_layer = Embedding(dictionary_size, num_word_dimensions,
                            weights=[embedding_weights], mask_zero=True,
                            embeddings_regularizer=regularizers.l2(0.0001))
model.add(TimeDistributed(embedding_layer,
                          input_shape=(max_conversation_length, timesteps)))

model.add(TimeDistributed(Bidirectional(LSTM(m // 2, return_sequences=True,
                                             kernel_regularizer=regularizers.l2(0.0001)))))
model.add(TimeDistributed(Dropout(0.2)))
model.add(TimeDistributed(GlobalMaxPooling1D()))
model.add(Bidirectional(LSTM(h // 2, return_sequences = True,
                             kernel_regularizer=regularizers.l2(0.0001)),
                        merge_mode='concat'))
model.add(Dropout(0.2))
crf = CRF(num_tags, sparse_target=False, kernel_regularizer=regularizers.l2(0.0001))
model.add(crf)
model.compile(optimizer, loss = crf.loss_function, metrics=[crf.accuracy])

1 Ответ

1 голос
/ 17 апреля 2019

Однако, так как я обрабатываю предложения с переменным количеством слов в них, мне нужно маскирование в слое Embedding.

Вы дополняете предложения, чтобы они имели одинаковую длину? Если это так, то вместо маскировки вы можете позволить модели самостоятельно определить, что 0 дополняет ее, поэтому ее следует игнорировать. Следовательно, вам не понадобится явная маскировка. Этот подход также используется для устранения пропущенных значений в данных, как это предлагается в этом ответе .

...