LSTM的多个功能,多个类别,多个输出

时间:2018-07-15 11:27:34

标签: python python-3.x scikit-learn keras lstm

我正在尝试使用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 个答案:

答案 0 :(得分: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)。