Создание набора речевых данных для бинарной классификации LSTM
Я пытаюсь сделать бинарную классификацию LSTM, используя theano. Я прошел пример кода, однако я хочу построить свой собственный.
У меня есть небольшой набор записей "Hello" и "Goodbye", которые я использую. Я предварительно обработал их, извлекая для них функции MFCC и сохраняя их в текстовом файле. У меня 20 речевых файлов (по 10 в каждом), и я создаю текстовый файл для каждого слова, поэтому 20 текстовых файлов содержат функции MFCC. Каждый файл представляет собой матрицу 13x56.
Моя проблема сейчас: Как я могу использовать этот текстовый файл для обучения LSTM?
Я относительно новичок в этом. Я также изучил некоторую литературу по этому вопросу, но не нашел действительно хорошего понимания концепции.
Любой более простой способ использования LSTM также будет приветствоваться.
1 ответ
Существует множество существующих реализаций, например, реализация Tensorflow, Kaldi-ориентированная реализация со всеми сценариями, лучше сначала проверить их.
Theano слишком низкоуровневый, вместо этого вы можете попробовать использовать keras, как описано в руководстве. Вы можете запустить учебник "как есть", чтобы понять, как идут дела.
Затем вам нужно подготовить набор данных. Вам нужно превратить ваши данные в последовательности фреймов данных, и для каждого фрейма данных в последовательности вам нужно назначить выходную метку.
Keras поддерживает два типа RNN: слои, возвращающие последовательности, и слои, возвращающие простые значения. Вы можете экспериментировать с обоими, в коде, который вы просто используете return_sequences=True
или же return_sequences=False
Для тренировки с последовательностями вы можете назначить фиктивную метку для всех кадров, кроме последнего, где вы можете назначить метку слова, которое вы хотите распознать. Вам необходимо поместить метки ввода и вывода в массивы. Так будет:
X = [[word1frame1, word1frame2, ..., word1framen],[word2frame1, word2frame2,...word2framen]]
Y = [[0,0,...,1], [0,0,....,2]]
В X каждый элемент представляет собой вектор из 13 чисел с плавающей запятой. В Y каждый элемент представляет собой просто число - 0 для промежуточных кадров и идентификатор слова для последнего кадра.
Чтобы тренироваться только с метками, вам нужно поместить метки ввода и вывода в массивы, а массив вывода проще. Таким образом, данные будут:
X = [[word1frame1, word1frame2, ..., word1framen],[word2frame1, word2frame2,...word2framen]]
Y = [[0,0,1], [0,1,0]]
Обратите внимание, что выходные данные векторизованы (np_utils.to_categorical), чтобы превратить их в векторы, а не просто в числа.
Затем вы создаете сетевую архитектуру. Вы можете иметь 13 чисел для ввода, вектор для вывода. В середине у вас может быть один полностью связанный слой, за которым следует один слой lstm. Не используйте слишком большие слои, начните с маленьких.
Затем вы кормите этот набор данных в model.fit
и он обучает вас модели. Вы можете оценить качество модели на удержанном наборе после тренировки.
У вас будут проблемы с конвергенцией, поскольку у вас всего 20 примеров. Вам нужно гораздо больше примеров, желательно тысяч, чтобы обучать LSTM, вы сможете использовать только очень маленькие модели.