【问题标题】:How to mask paddings in LSTM model for speech emotion recognition如何在 LSTM 模型中屏蔽填充以进行语音情感识别
【发布时间】:2021-01-27 10:33:03
【问题描述】:

给定几个 .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 模型应用掩码?

【问题讨论】:

    标签: tensorflow machine-learning keras deep-learning lstm


    【解决方案1】:

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

    我还记得你必须在顺序模型的第一层中指定输入形状。还请记住,您不需要传递样本维度。在您的情况下,输入形状是 (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()
    

    【讨论】:

    • 谢谢你的回复,我注意到你写的input_shape参数是一个二维数组,这表明模型可以自动识别X_train的第一维是batch或者我们可以命名数据集的索引?我问这个问题是因为我把我的训练数据集的整个形状放在了input_shape,如我的代码所示。我错了吗? @Marco Cerliani
    • 是的,这是错误的。正如我报告的那样,keras 不需要样本维度。它在训练过程中自动推断,以便将数据分成批次。不要忘记投票并接受它;-)
    • mask_value=0.0 已设置,我检查了我的数据集,那些零写为0.00E+00。面罩会因地名的数量不同而起作用吗? @Marco Cerliani
    • 是的,这不是问题......不要忘记投票并接受它;-)
    • 是的,我做到了,你介意看看我关于 3D 数组标准化的另一个简单问题吗?
    猜你喜欢
    • 1970-01-01
    • 2023-02-26
    • 2012-06-16
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多