Я пытаюсь использовать ANN для определения высоты музыкальных нот. Сеть представляет собой простой двухслойный MLP, входы которого в основном представляют собой DFT (усредненные и логарифмически распределенные), а 12 выходов соответствуют 12 нотам конкретной октавы.
Сеть обучается несколькими образцами из тех 12 заметок, которые играют какой-то инструмент (по одной заметке за раз), и несколько примеров "молчания".
Результаты на самом деле хорошие. Сеть способна точно распознавать те ноты, которые играют разные инструменты, а также отлаживается от шума и даже не освобождает ее от необходимости при воспроизведении песни.
Цель, однако, состоит в том, чтобы иметь возможность обнаруживать полифонический звук. Так что, когда две или более нот будут сыграны вместе, будут срабатывать две соответствующие нейроны. Удивительно то, что сеть на самом деле уже делает это до некоторой степени (обучается только монофоническим образцам), однако менее последовательно и менее точно, чем для монофонических заметок. Мой вопрос в том, как я могу улучшить его способность распознавать полифанский звук?
Проблема заключается в том, что я не совсем понимаю, почему она уже работает. Различные примечания (или их ДПФ) - это в основном разные точки в пространстве, для которых сеть обучается. Поэтому я понимаю, почему он распознает похожие звуки (близлежащие точки), но не то, как он "завершает" вывод для комбинации заметок (которые образуют отдаленную точку от каждого из примеров обучения). Точно так же сеть И, которая обучается над (0,0) (0,1) (1,0) = (0), не должна "заключать", что (1,1) = (1).
Приближение грубой силы к этому состоит в том, чтобы обучить сеть как можно большему количеству полифонических образцов. Однако, поскольку сеть, похоже, как-то смутно понимает идею из монофонических образцов, возможно, здесь есть что-то более фундаментальное.
Любые указатели? (извините за длину, кстати:).