将自定义掩码传递给 LSTM 数据以进行训练和验证

Passing a Custom mask to the LSTM data for training and validation

我已经准备好 LSTM 架构:

input1 = Input(shape=(1500, 3))
lstm = LSTM(units=100, return_sequences=False, activation='relu')(input1)
outputs = Dense(150, activation="sigmoid")(lstm)
model = Model(inputs=input1, outputs=outputs)
model.compile(loss="binary_crossentropy", optimizer="adam",
                  metrics=["accuracy"]) 

LSTM 层支持名为 mask 的调用参数。

我读取数据的方式是使用两个生成器,一个遍历训练文件,另一个遍历验证文件.fit方法我通过训练和验证生成器)。

model.fit(
        x=training_generator,
        epochs=10,
        steps_per_epoch=5, # there are 5 files
        validation_data=validation_generator,
        validation_steps=5, # there are 5 files
        verbose=1
    )

因此每个文件都会有一个给定的掩码(一个用于训练文件,另一个用于验证文件)。因此我的问题是,如何指定要使用的掩码?

我发现的工作方式是在预处理阶段转换数据。如果您根据掩码将数据中的值替换为您知道不在数据中的数字,例如 0 或 -999,则您可以向架构添加另一层,称为 Masking。该层有一个名为 mask_value 的参数,它与您用于转换数据的数字相同:

input1 = Input(shape=(n_timesteps, n_channels))
masking = Masking(mask_value=-999)(input1)
lstm1 = LSTM(units=100, return_sequences=False,
             activation="tanh")(masking)
outputs = Dense(n_timesteps, activation="sigmoid")(lstm1)
model = Model(inputs=input1, outputs=outputs)
model.compile(loss=keras.losses.BinaryCrossentropy(),
              optimizer=tf.keras.optimizers.Adam(learning_rate=0.01))

这样你就可以将其作为输入传递给 LSTM(因为 LSTM 允许这样做,其他一些类型的层则不允许)。