LSTM 多特征、多类、多输出

Posted

技术标签:

【中文标题】LSTM 多特征、多类、多输出【英文标题】:LSTM multiple features, multiple classes, multiple outputs 【发布时间】:2018-12-23 04:21:06 【问题描述】:

我正在尝试使用 LSTM 分类器根据我拥有的一些 midi 生成音乐。

LSTM 使用两个特征,音符的音高和音符的持续时间。

为了说明,假设我们有:

音高:[“A”、“B”、“C”]

持续时间:["0.5", "1", "1.5"]

您可以想象,生成的音符必须同时具有音高和持续时间。

我尝试使用 MultiLabelBinarizer 来做到这一点。

from sklearn.preprocessing import MultiLabelBinarizer
labels = [[x,y] for x in all_pitches for y in all_durations]

mlb = MultiLabelBinarizer()
mlb_value = mlb.fit_transform(labels)

这按预期划分了类,但我遇到的问题是在预测时出现的。

prediction = model.predict_proba(prediction_input)

indexes = np.argsort(prediction, axis=None)[::-1]
index1 = indexes[0]
index2 = indexes[1]

result1 = mlb.classes_[index1]
result2 = mlb.classes_[index2]

我需要音符同时具有音高和持续时间,所以这种方法似乎对我不起作用(我只能得到相同的两个音高)。

另一件事我认为是使用MultiOutputClassifier,但我似乎无法理解它们的区别,或者如何正确使用MultiOutputClassifier

感谢您的耐心等待,对于这个可能很愚蠢的问题,我们深表歉意。

【问题讨论】:

【参考方案1】:

您可以将 LSTM 输出输入到许多不同的层(通常是神经函数),从而产生不同的输出,然后在每个输出上同时训练您的模型:

from keras.models import Model
from keras.layers import Input, Dense, LSTM

# function definitions
lstm_function = LSTM(..args)
pitch_function = Dense(num_pitches, activation='softmax')
duration_function = Dense(num_durations, activation='softmax')
input_features = Input(input_dimensionality)

# function applications
lstm_output = lstm_function(input_features)
pitches = pitch_function(lstm_output)
durations = duration_function(lstm_output)

# model 
model = Model(inputs=[input_features], outputs=[pitches, durations])
model.compile(loss=['categorical_crossentropy', 'mse'], optimizer='RMSProp')

这可以推广到任意信息流,根据需要具有尽可能多的层/输出。请记住,您需要为每个输出定义相应的损失(或None)。

【讨论】:

完美!使用正确的形状,一切都会按预期进行。 很高兴听到这个消息! :) 祝你的项目好运

以上是关于LSTM 多特征、多类、多输出的主要内容,如果未能解决你的问题,请参考以下文章

[时间序列预测]基于BPRNNLSTMCNN-LSTM算法多特征(多影响因素)用电负荷预测[保姆级手把手教学]

基于pytorch搭建多特征LSTM时间序列预测代码详细解读(附完整代码)

如何使用 lstm 执行多类多输出分类

逻辑回归 单特征 多特征 Softmax多特征多分类

在Tensorflow中限制多类分类中的输出类

从通用句子编码器输出为 LSTM 生成输入