Tensorflow 语音情感识别LSTM模型中的填充掩模

Tensorflow 语音情感识别LSTM模型中的填充掩模,tensorflow,machine-learning,keras,deep-learning,lstm,Tensorflow,Machine Learning,Keras,Deep Learning,Lstm,给定了一些.wav音频文件的目录,我提取了它们在3D数组中的特征(批处理、步骤、特征) 在我的例子中,训练数据集是(1883100136)。 基本上,每个音频都经过100次分析(假设为1fps),每次提取136个特征。但是,这些音频文件的长度不同,因此其中一些文件无法分析100次 例如,其中一个音频有50组136个特征作为有效值,因此其余50组用零填充 这是我的模型 def LSTM_model_building(units=200,learning_rate=0.005,epochs=20,d

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

在我的例子中,训练数据集是(1883100136)。 基本上,每个音频都经过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
我希望屏蔽填充,但是上显示的指令使用了
嵌入层
,我相信这通常用于NLP。我不知道如何将
嵌入层
用于我的模型

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

有人能教我如何为我的LSTM模型应用掩蔽吗?

嵌入层不适合您的情况。你可以考虑“<代码>掩饰< /代码>”。它可以简单地集成在模型结构中,如下所示

我还记得您必须在顺序模型的第一层中指定输入形状。还请记住,您不需要传递示例维度。在您的情况下,输入形状是
(100136)
,它等于
(时间步,n_特征)


感谢您的回复,我注意到您编写的
input\u shape
参数是一个2D数组,它表明模型可以自动识别X\u列的第一个维度是批次还是我们可以将其命名为数据集的索引?我问这个问题是因为我将训练数据集的整个形状放在
input\u shape
中,如代码所示。我错了吗@Marco CerlianiYes,这是错误的。正如我所报告的那样,keras不需要样本维度。在培训过程中自动推断,以便将数据分为多个批次。别忘了投票并接受它;-)
mask_value=0.0
被设置,我检查我的数据集,这些零被写为
0.00E+00
。当非校准位置的数量不同时,面罩会起作用吗@Marco Cerlianiyes这不是问题。。。别忘了投票并接受它;-)是的,我问了,你介意看看我的另一个简单问题吗,关于3D阵列的标准化?