Вопрос или проблема
Я работаю над проектом для класса, в котором пытаюсь создать алгоритм, который изучает музыку и создает свою собственную музыку.
У меня есть проблемы с тем, как организовать данные для ввода в LSTM.
Один пример для обучения состоит из аккорда, который является вектором бинарных значений на основе того, какие клавиши нажаты в MIDI формате (индексы 0-127), значения, которое указывает на длительность ноты, силы удара, числителя размера такта и знаменателя размера такта, а также тональности, представленной количеством бемолей.
Так что один пример может выглядеть так:
$$\left[ \begin{array}{c} {0} \\ {1} \\{0} \\{1} \\{\vdots} \\ {1} \\ {0} \\ {4} \\ {3} \\ {4} \\ {4} \\ {-2} \end{array} \right]$$
Результат – это вектор 132×1.
У меня были проблемы с концептуализацией того, как ввести этот тип данных в LSTM. Линейный вывод не имел бы большого смысла, но я не знаю, можно ли напрямую использовать этот вектор в one-hot представлении.
Вы должны задать себе вопрос – обучаете ли вы алгоритм играть аккорды или играть музыку? Кроме того, что вы пытаетесь здесь предсказать?
Мне кажется, что вам нужно создать входные данные, которые представляют собой серию аккордов, а ваш ярлык – это следующий аккорд мелодии. Поэтому вам следует разработать нейронную сеть, которая принимает серию аккордов и может предсказать следующий аккорд в последовательности, добавляет его обратно в входную последовательность и выбирает следующий аккорд, добавляет его обратно в входную последовательность и так далее. В следующую минуту у вас будет нейронная сеть, которая может играть музыку.
Если вы используете Tensorflow, то создайте входной тензор с размерами, указанными ниже:
input_data = tf.placeholder(tf.float32, [batch_size, timesteps, input_size], name="inputs")
Чтобы ввести этот тип данных в LSTM, вы можете использовать слой встраивания, который обычно используется в задачах обработки естественного языка (NLP) для представления дискретных входных токенов в виде непрерывных векторов.
В вашем случае вы можете создать слой встраивания для каждого из категориальных переменных в вашем входном векторе (т.е., аккорд, длительность, сила удара, числитель размера такта, знаменатель размера такта и тональность). Каждый слой встраивания будет отображать дискретную переменную в непрерывное векторное представление.
Для ввода аккорда вы можете представить его в виде one-hot закодированного вектора длиной 128 (соответствующего номерам MIDI-нот). Затем вы можете пропустить этот one-hot закодированный вектор через слой встраивания с указанным размером встраивания (например, 32), чтобы получить 32-мерное векторное представление аккорда.
Для непрерывных переменных (то есть длительность, сила удара, числитель размера такта, знаменатель размера такта и тональность) вы можете пропустить их через линейный слой, чтобы получить непрерывное векторное представление.
После того, как вы получили непрерывные векторные представления для каждой входной переменной, вы можете объединить их в один вектор и передать его через LSTM.
Выход LSTM затем можно пропустить через линейный слой, чтобы получить предсказанный аккорд для следующего временного шага.
Ответ или решение
Вопрос о том, как запустить LSTM с музыкальными данными, является важной задачей в области машинного обучения и генерации музыки. В данной статье мы подробно разберем, как правильно подготовить данные, чтобы затем использовать их в модели LSTM для создания музыки.
Понимание задачи
Прежде всего, ключевым моментом является понимание, что именно вы хотите достичь: обучение алгоритма игре аккордов или созданию музыки в целом. В вашем случае, вы стремитесь создать алгоритм, который научится предсказывать следующий аккорд на основе предыдущих. Это предполагает, что модель будет принимать последовательность аккордов и выдавать следующий.
Подготовка данных
Ваши входные данные представлены в виде вектора длиной 132:
- Первые 128 элементов представляют бинарные значения для аккорда (в MIDI-формате).
- Далее идут значения для:
- Длительности ноты.
- Силы удара (beat strength).
- Числителя тактовой меры.
- Знака ключа (количество бемолей).
Для того чтобы использовать этот массив в LSTM, вам необходимо определить, как будет выглядеть ваша модель и как будет организован ввод данных.
-
Формирование последовательности входных данных: Вместо того чтобы использовать один аккорд, объедините несколько последовательных аккордов в одну входную последовательность. Например, если ваша последовательность состоит из
N
аккордов, вы можете создать массив размерности[N, 132]
для каждого примера. -
Структура входного тензора: В TensorFlow создайте двумерный тензор, который будет принимать форму
[batch_size, timesteps, input_size]
, гдеinput_size = 132
. Важно также учитывать, что при обучении LSTM вам необходимо будет указывать размер партии (batch_size
) и количество временных шагов (timesteps
).input_data = tf.placeholder(tf.float32, [batch_size, timesteps, 132], name="inputs")
Преобразование данных
Для лучшего представления и работы с данными рассмотрим, как сопоставить разные типы данных:
-
Одноразрядное кодирование (One-hot encoding): Для представления аккорда (первых 128 значений) вы можете использовать одноразрядное кодирование и затем передать его через слой встраивания (embedding layer). Это преобразует вашу бинарную матрицу аккордов в непрерывные векторные представления. Например, следует создать слой встраивания длиной 32, чтобы преобразовать каждую бинарную векторную представление в 32-мерный вектор.
-
Непрерывные переменные: Длительность ноты, сила удара, числитель и знаменатель тактовой меры, а также знак ключа могут быть переданы через линейный слой. Эти значения не нуждаются в специальном кодировании, так как они уже являются числовыми.
Конкатенация данных и LSTM
После того как вы получили непрерывные представления для каждого из входных параметров, вам нужно их сконкатенировать в один вектор. Это делается для обеспечения совместимости с LSTM. Получившийся вектор можно будет передать через LSTM-сеть.
Предсказание следующего аккорда
Выход LSTM можно подключить к линейному слою, который будет предсказывать следующий аккорд на основе текущей последовательности. Это создаст модель, которая способна не только предсказывать аккорды, но и будет генерировать музыку, используя обратную связь.
Заключение
Создание алгоритма, который генерирует музыку на основе последовательностей аккордов, является сложной задачей, требующей правильной настройки данных и архитектуры модели. Используйте описанные методы преобразования и обработки данных, чтобы обеспечить эффективное обучение вашей LSTM-модели. Следуя этому подходу, вы сможете разработать эффективную модель для генерации музыки, которая будет способна давать интересные результаты.