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算法多特征(多影响因素)用电负荷预测[保姆级手把手教学]