Как использовать нейронную сеть LSTM с трехмерным категориальным вводом и выводом? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь использовать Keras для обучения рекурсивной нейронной сети LSTM, способной предсказывать следующую ноту, сыгранную путем получения последовательности нот.По сути, мой набор данных примерно такой, и я хочу, чтобы моя модель предсказывала пятую сыгранную ноту:

     Note1     Note2     Note3    Note4  |  Note5

1   [A,2,#]   [B,3,b]   [C,4,#]  [A,2,b] | [B,3,b]

2   [B,2,#]   [B,2,b]   [B,5,#]  [A,2,#] | [A,3,#]

3   [C,2,#]   [B,5,#]   [A,4,#]  [A,1,#] | [A,8,b]

...

Каждая нота представляет собой массив из 3 функций, и все они являются категориальными.Я изо всех сил пытаюсь понять, как я могу снабдить нейронную сеть этой информацией, поэтому любая помощь с кодом о том, как обрабатывать данные или сетевую архитектуру, приветствуется.Заранее спасибо.

1 Ответ

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

Вам нужно будет найти кодировку, которая преобразует ваши данные в формат, понятный нейронной сети.Обычный подход - однократное кодирование : предположим, что у вас есть 7 нот (A, B, C ...) 3 октавы (2,3,4) и резкая плоская нейтраль.С одним горячим становится 3 вектора (7,);(3,);(3;) и давайте возьмем [A,2,#] -> [1,0,0,0,0,0,0,1,0,0,1,0,0], в котором индексы для категорий установлены в 1. Это только один способ сделать это, для ваших заметок вы бы создали матрицу (4, 13), которая говорит, что 4 примечаниязакодирован как один горячий в каждой категории.

Другим способом было бы сделать каждую заметку уникальной, чтобы у вас был вектор (88,), который сообщает сети, какой нотой это будет, [A,2,#] -> [...0,0,1,0,0...] только 1, гдепримечание установлено.Это, очевидно, увеличит размер вектора, но сделает его более очевидным для сети.Но в настоящее время 88 компьютеров для компьютеров невелика.Вот как пурпурный кодирует ноты, они кодируют больше вещей, таких как время и т. Д., А также для большей динамики генерации музыки.Наконец вы можете создать сеть:

model = Sequential()
model.add(LSTM(some_hidden_number_units, input_shape=(4, 88)) # 4 past notes
model.add(Dense(88, activation='softmax')) # predict one of 88 notes
model.compile(loss='categorical_crossentropy', ...)
...