Почему слой Masking в Tensorflow пропускает значения, которые должен был маскировать?
Я пытаюсь создать чат-бота с архитектурой 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 позволяет скрывать только нули
Я буду очень благодарен за помощь! :)