如何在用于语音情感识别的 LSTM 模型中屏蔽填充

How to mask paddings in LSTM model for speech emotion recognition

给定一些 .wav 音频文件目录,我根据 3D 数组(批次、步骤、特征)提取了它们的特征。

就我而言,训练数据集是 (1883,100,136)。 基本上,每个音频都被分析了 100 次(假设为 1fps),每次都提取了 136 个特征。但是,这些音频文件的长度不同,因此其中一些无法分析 100 次。

例如,其中一个音频有 50 组 136 个特征作为有效值,因此其余 50 组用零填充。

这是我的模型。

def LSTM_model_building(units=200,learning_rate=0.005,epochs=20,dropout=0.19,recurrent_dropout=0.2):
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout, input_shape=(X_train.shape[0],100, 136))))
#     model.add(tf.keras.layers.Bidirectional(LSTM(32)))
    model.add(Dense(num_classes, activation='softmax'))
    
    adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
    opt = tf.keras.optimizers.RMSprop(lr=learning_rate, rho=0.9, epsilon=1e-6)
#     opt = tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.9, decay=0., nesterov=False)
    
    model.compile(loss='categorical_crossentropy',
                  optimizer=adamopt,
                  metrics=['accuracy'])

    history = model.fit(X_train, y_train,
              batch_size=batch_size,
              epochs=epochs,
              validation_data=(X_test, y_test),
                        verbose = 1)

    score, acc = model.evaluate(X_test, y_test,
                                batch_size=batch_size)
    return history

我想屏蔽填充,但是 Keras website 上显示的指令使用 embedding layer,我认为它通常用于 NLP。我不知道如何为我的模型使用 embedding layer

谁能教我如何为我的 LSTM 模型应用掩码?

Embedding 图层不适合您的情况。您可以考虑 Masking layer。它可以简单地集成到您的模型结构中,如下所示。

我还记得你,输入形状必须在顺序模型的第一层指定。还请记住,您不需要传递样本维度。在您的情况下,输入形状是 (100,136) 等于 (timesteps,n_features)

units,learning_rate,dropout,recurrent_dropout = 200,0.005,0.19,0.2
num_classes = 3

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Masking(mask_value=0.0, input_shape=(100,136)))
model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
model.add(Dense(num_classes, activation='softmax'))

adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
opt = tf.keras.optimizers.RMSprop(lr=learning_rate, rho=0.9, epsilon=1e-6)

model.compile(loss='categorical_crossentropy',
              optimizer=adamopt,
              metrics=['accuracy'])

model.summary()