Почему слой Masking в Tensorflow пропускает значения, которые должен был маскировать?

Рейтинг: 1Ответов: 0Опубликовано: 21.07.2023

Я пытаюсь создать чат-бота с архитектурой seq2seq с моделями LSTM (в учебных целях). Чтобы тензоры были однородными, я дополнял короткие фразы специальными токенами padding_token (который, в моём случае, равен 0). Если сеть обучить на данных, которые дополнены токенами padding_token, то на данных без токена она начинает работать плохо. Поэтому я решил использовать Masking слой, чтобы пропускать токены, равные padding_token. Но, по какой-то причине, Masking слой не работает - его наличие никак не повлияло на результат.

Я также выложил весь мой проект на github.

Вот как выглядит мой код:

#encoder
#####################################################################
encoder_input = layers.Input(shape=1, name="encoder_input")

encoder_masking = layers.Masking(mask_value=padding_token, 
                                 input_shape=(None, 1), 
                                 name="encoder_masking")(encoder_input)

encoder_embedding = layers.Embedding(input_dim=count_tokens,                                  
                                     output_dim=dim_embedding, 
                                     input_shape=(None,), 
                                     name="encoder_embedding")(encoder_masking)

encoder_lstm_1, encoder_state_h_1, encoder_state_c_1 
                  = layers.LSTM(units=dim_lstm_1, 
                                input_shape=(None,), 
                                return_sequences=True, 
                                return_state=True, 
                                name="encoder_lstm_1")(encoder_embedding)

encoder_lstm_2, encoder_state_h_2, encoder_state_c_2 
                 = layers.LSTM(units=dim_lstm_2, 
                               input_shape=(None,), 
                               return_sequences=True, 
                               return_state=True, 
                               name="encoder_lstm_2")(encoder_lstm_1)

encoder_states_1 = [encoder_state_h_1, encoder_state_c_1]
encoder_states_2 = [encoder_state_h_2, encoder_state_c_2]

#decoder
#####################################################################

decoder_input = layers.Input(shape=1, name="decoder_input")

decoder_embedding = layers.Embedding(input_dim=count_tokens,
                                     output_dim=dim_embedding, 
                                     input_shape=(None,), 
                                     name="decoder_embedding")(decoder_input)

decoder_lstm_1, _, _ 
        = layers.LSTM(units=dim_lstm_1, 
                      input_shape=(None,), 
                      return_sequences=True, 
                      return_state=True, 
                      name="decoder_lstm_1)(decoder_embedding,
                                            initial_state=encoder_states_1)

decoder_lstm_2, _, _ 
    = layers.LSTM(units=dim_lstm_2, 
                  input_shape=(None,), 
                  return_sequences=True, 
                  return_state=True, 
                  name="decoder_lstm_2")(decoder_lstm_1,
                                         initial_state=encoder_states_2)

decoder_dense = layers.Dense(units=dim_dense, 
                             activation="sigmoid", 
                             name="decoder_dense")(decoder_lstm_2)

#####################################################################

encoder_decoder_model = keras.Model(inputs=[encoder_input, decoder_input], outputs=decoder_dense)

Эту модель я использовал чисто для обучения, затем я её разделил на две отдельные модели encoder и decoder.

P.S. Если я использую в слое Embedding параметр mask_zero=True, тогда маска начинает действительно работать (это показывает корректность кода, для проверки работы слоя Masking). Хоть у меня и работает в таком случае, тем не менее, мне бы действительно хотелось узнать, почему же слой Masking не работает, ведь параметр mask_zero позволяет скрывать только нули

Я буду очень благодарен за помощь! :)

Ответы

Ответов пока нет.