Модель идентификации говорящих на основе глубокого обучения Keras показывает отличные результаты во время обучения, а затем проваливает предсказания.

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

Я пытаюсь создать модель идентификации говорящего 1:N с использованием Keras и TensorFlow в качестве бэкенда. Я использовал корпус LibriSpeech для обучающих данных и предварительно обработал данные, сначала конвертировав каждый файл из .FLAC в .WAV, а затем рассчитав коэффициенты мел-частотного кепстра (MFCC) из первых трех секунд аудио. Затем я подал MFCC в сверточную нейронную сеть (CNN), созданную с помощью следующей функции:

def createModel(self, model_input, n_outputs, first_session=True):
        
        if first_session != True:
            model = load_model('SI_ideal_model_fixed.hdf5')
            
            return model
        
        # Определить входной слой
        inputs = model_input
    
        # Определить первый слой Conv2D
        conv = Conv2D(filters=32,
                      kernel_size=(5, 5),
                      activation='relu',
                      padding='same',
                      strides=3,
                      name="conv_1A")(inputs)
        conv = Conv2D(filters=32,
                      kernel_size=(5, 5),
                      activation='relu',
                      padding='same',
                      strides=3,
                      name="conv1B")(conv)
        conv = MaxPooling2D(pool_size=(3, 3), padding='same', name="maxpool_1")(conv)
        conv = Dropout(0.3, name="dropout_1")(conv)
    
        # Определить второй слой Conv2D
        conv = Conv2D(filters=64,
                      kernel_size=(3, 3),
                      activation='relu',
                      padding='same',
                      strides=3,
                      name="conv_2A")(conv)
        conv = Conv2D(filters=64,
                      kernel_size=(3, 3),
                      activation='relu',
                      padding='same',
                      strides=3,
                      name="conv_2B")(conv)
        conv = MaxPooling2D(pool_size=(3, 3), padding='same', name="maxpool_2")(conv)
        conv = Dropout(0.3, name="dropout_2")(conv)
    
        # Определить третий слой Conv2D
        conv = Conv2D(filters=128,
                      kernel_size=(3, 3),
                      activation='relu',
                      padding='same',
                      strides=3,
                      name="conv_3A")(conv)
        conv = Conv2D(filters=128,
                      kernel_size=(3, 3),
                      activation='relu',
                      padding='same',
                      strides=3,
                      name="conv_3B")(conv)
        conv = MaxPooling2D(pool_size=(3, 3), padding='same', name="maxpool_3")(conv)
        conv = Dropout(0.3, name="droupout_3")(conv)
    
        # Определить слой Flatten
        conv = Flatten(name="flatten")(conv)
    
        # Определить первый полносвязный слой
        conv = Dense(256, activation='relu', name="dense_a")(conv)
        conv = Dropout(0.2, name="dropout_4")(conv)
    
        # Определить второй полносвязный слой
        conv = Dense(128, activation='relu', name="dense_b")(conv)
        conv = Dropout(0.2, name="dropout_5")(conv)

        # Определить выходной слой
        outputs = Dense(n_outputs, activation='softmax', name="output")(conv)
    
        # Создать модель
        model = Model(inputs, outputs)
        
        model.summary()
    
        return model

Модель разработана для определения, является ли speaker одним из 15 заинтересованных лиц, поэтому затем она была дообучена с использованием переноса обучения на базе данных из 15 говорящих. Для целей тестирования база данных состояла из 14 говорящих LibriSpeech, которых модель никогда не видела раньше, и меня. На этом этапе обучения модель достигла максимальной точности валидации 0.9416:

Epoch 10/100
547/547 [==============================] - 0s 498us/step - loss: 0.1778 - accuracy: 0.9452 - val_loss: 0.2544 - val_accuracy: 0.9416

Epoch 00010: val_accuracy improved from 0.91971 to 0.94161, saving model to SI_ideal_model_fixed.hdf5

Наконец, я записал живой образец своего голоса и попросил модель предсказать, это я или один из говорящих LibriSpeech с помощью следующей функции:

def predict(self, audio_path):
        
        # Импортировать модель
        model, data = self.importModel(audio_path)
        
        # Подготовить аудио для предсказания
        pla = ProcessLiveAudio()
        file = pla.getMFCCFromRec()
        
        # Интерпретировать предсказание
        prob = model.predict(file) # Сделать предсказание
        print(prob)
        index = np.argmax(prob) # Декодировать one-hot вектор
        prob_max = prob[0][index] # Уверенность ответа
        prediction = data[2][index] # Определить соответствующего говорящего

        # Печать результатов
        print('Speaker: ' + prediction)
        print('Confidence: ' + str(prob_max*100) + ' %')

С следующими результатами (говорящие в первом списке, ZH – это я, а соответствующие вероятности во втором):

['1743', '1992', '2182', '2196', '2277', '2412', '2428', '2803', '2902', '3000', '3081', '3170', '3536',
'3576','ZH']
[[1.0116849e-04 9.0038668e-08 9.9856061e-01 5.8844932e-07 2.0543277e-05
  5.1232328e-06 3.5524553e-07 5.9479582e-08 7.4726445e-06 6.2108990e-10
  2.0075995e-10 2.6086704e-08 1.0949866e-03 2.0887743e-04 7.1733335e-12]]

Таким образом, модель не только предсказала с уверенностью 99.86%, что я совершенно другой человек, но и предположила, что я был самым маловероятным классификатором, к которому принадлежал аудиосигнал. Более того, та же проблема возникала на каждом последующем тесте модели, иногда с разным некорректным говорящим. Тем не менее, я сбит с толку, как улучшить модель, поскольку она явно преуспела на этапах обучения и избежала значительного переобучения. Вопрос в том, связано ли это с обучением, или это проблема с моей функцией предсказания, или даже что-то совершенно другое?

Итог: Каковы лучшие шаги для исправления модели многоклассовой классификации Keras, которая хорошо работает на этапе обучения, а затем уверенно предсказывает неверный классификатор?

Я новичок в ML/Keras, и любая помощь была бы очень кстати.

Ваша модель не способна обобщать на новые данные. Одна из возможных причин – новые данные не похожи на обучающие данные.

Существует множество причин:

  • Разные говорящие
  • Разный процесс записи аудио
  • Разная предварительная обработка аудио
  • Разные конвертации форматов файлов
  • Разная послезапись аудио
  • Глубокая нейронная сеть слишком хорошо выучила конкретный обучающий набор данных.

Один из подходов – систематически пройтись по каждому шагу и убедиться, что новые данные максимально приближены к обучающим данным. Если это не помогает, увеличьте регуляризацию в модели.

Другой причиной отсутствия обобщения может быть то, что модель переобучена и изучила, как идентифицировать отдельных лиц в обучающих данных. Если включение новых данных в ваш обучающий набор не улучшает результаты, попробуйте удалить параметры из модели или убрать один слой и посмотреть, как это повлияет на результаты тестирования.

Ответ или решение

Решение проблемы идентификации говорящего с помощью Keras: причины неудачных предсказаний и пути их устранения

Проблема, с которой вы столкнулись в процессе разработки модели идентификации говорящего на основе Keras, может возникнуть из-за нескольких факторов, даже если на этапе обучения модель демонстрирует отличные результаты. Основные аспекты, которые важно учитывать, включают общую архитектуру модели, качество предварительной обработки данных и обобщающие способности модели. Давайте подробно разоберем возможные причины и предложим потенциальные решения.

Причины неудачных предсказаний

  1. Отличия в данных:

    • Разные говорящие: Ваши данные для тестирования включают как 14 предыдущих говорящих из корпуса LibriSpeech, так и вашу собственную запись. Если ваша запись имеет отличительные акустические особенности, о которых модель не знала до этого, она может не распознать вас должным образом.
    • Процесс записи звука: Убедитесь, что условия записи звука для обучения и тестирования максимально сопоставимы. Различия в микрофонах, окружающем шуме и акустических условиях могут существенно повлиять на качество предсказания.
  2. Качество предварительной обработки:

    • Убедитесь, что процесс получения MFCC (мел-частотных кепстральных коэффициентов) для тестовых данных идентичен тому, что использовался для обучающего набора данных. Любые изменения в параметрах, таких как размер окна или шаг, могут негативно сказаться на результатах.
  3. Недостаточная обобщаемость модели:

    • Возможно, модель слишком хорошо адаптировалась к обучающим данным, что привело к переобучению. Это может проявляться тем, что точность на обучающем наборе данных значительно выше, чем на валидационном или тестовом.

Рекомендации по улучшению модели

Проверка и стандартизация данных

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

Обогащение обучающего набора данных

  • Попробуйте включить в обучающий набор данные, собранные в схожих условиях, но с различными говорящими. Это поможет модели лучше обобщить информацию и распознавать людей, которые не входили в предварительные обучающие наборы.

Регуляризация и структура модели

  • Увеличьте уровень регуляризации, добавив слои Dropout или L2-регуляризацию в Dense-слоях.
  • Рассмотрите возможность уменьшения количества параметров модели, например, сократив количество фильтров в свёрточных слоях или упрощая архитектуру.

Ретренинг и используя дополнительные данные

  • Проведите повторное обучение модели, используя более разнообразные сэмплы, которые включают в себя записи вашего голоса в разных стилях и условиях. Это улучшит качество предсказаний для вашего голоса и, возможно, для других говорящих.

Оценка точности

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

Заключение

Работа над моделью идентификации говорящего требует внимания к множественным аспектам, включая структуру модели и подготовку данных. Основная задача — добиться того, чтобы модель смогла успешно обобщать знания, полученные из обучающей выборки, чтобы точно предсказывать нового говорящего. Начните с проверки ваших процессов предварительной обработки, увеличения объема и разнообразия обучающих данных и оптимизации архитектуры нейронной сети. Постепенные корректировки и тестирования помогут в дальнейшем довести модель до нужного уровня точности.

Предложенные решения могут потребовать времени и усилий, однако они способны значительно улучшить результаты вашей модели и ее способность идентифицировать говорящих в разнообразных условиях.

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

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