Какую форму должны принимать данные y при прогнозировании соответствующего списка для другого списка - PullRequest
0 голосов
/ 19 мая 2018

Фон

Есть два списка символов.Один список содержит ноты для фортепиано и другой ноты.Идея состоит в том, чтобы обучить модель предсказывать струнные ноты на основе нот пианино.Таким образом, он генерирует струнную мелодию для фортепиано.Чтобы сделать его более беглым, следует учитывать не только текущую фортепианную ноту, но и предыдущие.

Данные

Я создал набор данных с более чем 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 нот длиной предсказывают соответствующие струнные ноты с одинаковой длиной нот.Таким образом, из единственного списка примечаний фортепьяно я мог предсказать список примечания последовательности.Это означает, что для каждой мелодии пианино может быть добавлена ​​соответствующая струнная мелодия.

1 Ответ

0 голосов
/ 19 мая 2018

В настоящее время вы сжимаете измерение времени, не возвращая последовательности во втором 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')))

Теперь на выходе также будут последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...