Запуск LSTM с музыкальными данными

Вопрос или проблема

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

У меня есть проблемы с тем, как организовать данные для ввода в 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, вам необходимо определить, как будет выглядеть ваша модель и как будет организован ввод данных.

  1. Формирование последовательности входных данных: Вместо того чтобы использовать один аккорд, объедините несколько последовательных аккордов в одну входную последовательность. Например, если ваша последовательность состоит из N аккордов, вы можете создать массив размерности [N, 132] для каждого примера.

  2. Структура входного тензора: В 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-модели. Следуя этому подходу, вы сможете разработать эффективную модель для генерации музыки, которая будет способна давать интересные результаты.

Оцените материал
Добавить комментарий

Капча загружается...