Как использовать результат встраивания с mask_zero=True в керасе

В керасе я хочу вычислить среднее значение ненулевого вложения. Интересно, в чем разница между mask_zero=True или False в Embedded Layer. Я попробовал код ниже:

input_data = Input(shape=(5,), dtype='int32', name='input')
embedding_layer = Embedding(1000, 24, input_length=5,mask_zero=True,name='embedding')
out = word_embedding_layer(input_data)
def antirectifier(x):
    x = K.mean(x, axis=1, keepdims=True)
    return x
def antirectifier_output_shape(input_shape):
    shape = list(input_shape)
    return tuple(shape)
out = Lambda(antirectifier, output_shape=antirectifier_output_shape,name='lambda')(out)

Но кажется, что результат является средним значением всех элементов, как я могу просто рассчитать среднее значение всех ненулевых входных данных?

1 ответ

Из документа функции:

Если это правда, то все последующие слои в модели должны поддерживать маскирование

Ваша лямбда-функция не поддерживает маскирование. Например, повторяющиеся слои в Keras поддерживают маскирование. Если вы установите mask_zero=True в ваших вложениях все 0 индексов, которые вы передаете в слой внедрения, будут распространяться как "замаскированные", и следующие слои, способные понимать "замаскированную" информацию, будут использовать их.

По сути, если вы создаете "средний" слой, который захватывает маску и вычисляет среднее значение только для немаскированных значений, то вы получите желаемые результаты.

Вы можете найти здесь способ создания ваших лямбда-слоев, которые поддерживают маскирование

Я надеюсь, что это помогает.

Другие вопросы по тегам