Доброго времени суток. Стоит задача написать классификатор для кластеризации языка голоса.
Языка всего 2. Английский и русский.
Хотел спросить правильно ли я понял проблему и правильно ли двигаюсь в реализации.
В качестве признаков использую 13 MFCC + 13 deriv MFCC + 13 deriv deriv MFCC. В качестве классификатора использую рекуррентную нейронную сеть типа LSTM. Архитектура сети: 39-100-2:
39 - входных нейрона,
100 - юнитов LSTM
2 - выходных нейрона. Один отвечает за русский язык, второй за английский.
Сформировал от разных дикторов по 10 часов ИКМ для каждого из языка. Получилось примерно по 150 файлов для каждого языка.
Сформировал массив меток для обучения сети. [1 0] - если подаётся файл с русским языком, [0 1] - английский.
Все файлы перед подачей перетасовываются.
Далее делаю так:
Подаю файл на сеть, прогоняю прямым ходом. Проверяю на сходимость. Если не сошлось: двигаюсь от конца к началу для каждого из признака MFCC + dMFCC + ddMFCC (метод обратного распространения ошибки).
Другими словами, допустим для файла с русской речью, устанавливаю метку на выходе выставляю в [1 0] и прогоняю весь файл. После этого в обратном ходе делаю так
Формирую дельту:
ошибка -> выходной слой -> скрытый слой (LSTM)
ошибка -> выходной слой -> скрытый слой (LSTM)
ошибка -> выходной слой -> скрытый слой (LSTM)
.
.
.
ошибка -> выходной слой -> скрытый слой (LSTM)
Коррекция весов.
Далее беру следующий файл, допустим с английской речью выставляю метку на выходе в [0 1]
и дальше как в прошлом случае:
Формирую дельту:
ошибка -> выходной слой -> скрытый слой (LSTM)
ошибка -> выходной слой -> скрытый слой (LSTM)
ошибка -> выходной слой -> скрытый слой (LSTM)
.
.
.
ошибка -> выходной слой -> скрытый слой (LSTM)
и т.д. пока ошибки для всех файлов будут меньше заданного порога.
Я правильно понимаю проблему?
При реализации столкнулся с проблемой, что для одних файлов во время обучения ошибка уменьшается для других растёт. Допустим ели взять два файла, один с англ речью другой с русской, то для русского файла ошибка будет уменьшаться и идти на убыль, для английского напротив растёт, суммарная ошибка примерно равна 1, т.е. для одного языка уменьшается , для другого увеличивается.
Не понимаю, где ошибка или что я делаю не так. В коде вроде ошибок нет, мне кажется где-то фундаментальная ошибка, т.е. я что-то не так понимаю и реализовал соответственно.
Буду рад любой информации.