我正在尝试使用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
。
感谢您的耐心配合,对于可能愚蠢的问题表示歉意。
答案 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
)。