【问题标题】:What shape should take y data when predicting corresponding list for another list预测另一个列表的对应列表时应采用什么形状的数据
【发布时间】:2018-05-19 09:51:16
【问题描述】:

背景

有两个字符列表。一个列表包含钢琴音符和另一个弦乐音符。想法是训练模型根据钢琴音符预测弦音符。所以它生成钢琴的弦乐旋律。为了使其更流畅,它不仅应该考虑当前的钢琴音符,还应该考虑以前的钢琴音符。

数据

我创建了包含 100 多首歌曲的数据集(并且仍在选择新歌曲)。目前钢琴和弦乐列表的总音符数为 48523。钢琴音符的词汇量为 447,弦音符的词汇量为 261

len(set(piano_notes)) #447
len(set(string_notes)) #261

所有笔记都是一个热编码,序列长度为100。两种列表形状:

print(x.shape) #(48523, 100, 447)
print(y.shape) #(48523, 100, 261)

问题

我不清楚 y 数据应该采用什么形状?网络如下所示:

def create_network(x, n_vocab_string_notes):
""" create the structure of the neural network """
model = Sequential()

model.add(LSTM(
    512,
    input_shape=(x.shape[1], x.shape[2]),
    return_sequences=True
))
model.add(Dropout(0.3))
model.add(LSTM(512, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(512))
model.add(Dense(256))
model.add(Dropout(0.3))
model.add(Dense(n_vocab_string_notes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

return model

还有这样的训练:

def train(model, x, y):
""" train the neural network """
file_path = "weights-improved.hdf5"
checkpoint = ModelCheckpoint(
    file_path,
    monitor='loss',
    verbose=0,
    save_best_only=True,
    mode='min'
)
callbacks_list = [checkpoint]

model.fit(x, y, epochs=200, batch_size=64, callbacks=callbacks_list)

现在它返回错误,因为 y 形状不是应有的样子。它说得到了一个形状为 (48523, 100, 261) 的数组,而不是预期的 2 个维度。

目标

目标是根据钢琴音符预测弦音符。即对于钢琴音符,例如,长度为 100 的音符预测相同音符长度中的相应弦音符。 因此,从单个钢琴音符列表中,我可以预测弦音符列表。这意味着对于每一个钢琴旋律,都可以添加相应的弦乐旋律。

【问题讨论】:

  • 似乎您只是将整个数据转储到模型上。你想达到什么目的?根据整首歌曲预测单弦、多弦,只是以前的音符?这些将决定您如何处理数据。
  • 目标是根据钢琴音符预测弦音符。那是对于普通的钢琴旋律,例如,100 个音符长度预测相同音符长度的相应弦乐旋律。所以以后对于普通的钢琴旋律,也可以添加弦乐旋律。

标签: python machine-learning keras training-data one-hot-encoding


【解决方案1】:

您当前正在通过不返回第二个LSTM(100) 中的序列来压缩时间维度。您还需要返回一个序列并处理上层。大致如下:

# second lstm
model.add(LSTM(512, return_sequences=True))
model.add(TimeDistributed(Dense(256)))
model.add(Dropout(0.3))
model.add(TimeDistributed(Dense(n_vocab_string_notes, activation='softmax')))

现在输出也将是序列。

【讨论】:

    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2020-06-06
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多