为另一个列表预测相应列表时,应该采用什么形状的 y 数据
What shape should take y data when predicting corresponding list for another list
背景
有两个字符列表。一个列表包含钢琴音符和另一个弦乐音符。想法是训练模型根据钢琴音符预测弦乐音符。因此它生成弦乐旋律到钢琴。为了让它更流畅,它不仅应该考虑当前的钢琴音符,还应该考虑以前的钢琴音符。
数据
我创建了包含 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)
现在它 returns 错误,因为 y 形状不正确。它说得到了一个形状为 (48523, 100, 261) 的数组,而不是预期的 2 个维度。
目标
目标是根据钢琴音符预测弦乐音符。即对于钢琴音符,例如,100 个音符长度预测相同音符长度的相应弦乐音符。
所以从单个钢琴音符列表我可以预测弦乐音符列表。意思是每一个钢琴旋律都可以加上相应的弦乐旋律。
您目前正在通过不 return 第二个 LSTM(100)
中的序列来压缩时间维度。您还需要 return 一个序列并处理上层。大致如下:
# 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')))
现在输出也将是序列。
背景
有两个字符列表。一个列表包含钢琴音符和另一个弦乐音符。想法是训练模型根据钢琴音符预测弦乐音符。因此它生成弦乐旋律到钢琴。为了让它更流畅,它不仅应该考虑当前的钢琴音符,还应该考虑以前的钢琴音符。
数据
我创建了包含 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)
现在它 returns 错误,因为 y 形状不正确。它说得到了一个形状为 (48523, 100, 261) 的数组,而不是预期的 2 个维度。
目标
目标是根据钢琴音符预测弦乐音符。即对于钢琴音符,例如,100 个音符长度预测相同音符长度的相应弦乐音符。 所以从单个钢琴音符列表我可以预测弦乐音符列表。意思是每一个钢琴旋律都可以加上相应的弦乐旋律。
您目前正在通过不 return 第二个 LSTM(100)
中的序列来压缩时间维度。您还需要 return 一个序列并处理上层。大致如下:
# 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')))
现在输出也将是序列。