- Вопрос или проблема
- Ответ или решение
- Решение проблемы идентификации говорящего с помощью 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, может возникнуть из-за нескольких факторов, даже если на этапе обучения модель демонстрирует отличные результаты. Основные аспекты, которые важно учитывать, включают общую архитектуру модели, качество предварительной обработки данных и обобщающие способности модели. Давайте подробно разоберем возможные причины и предложим потенциальные решения.
Причины неудачных предсказаний
-
Отличия в данных:
- Разные говорящие: Ваши данные для тестирования включают как 14 предыдущих говорящих из корпуса LibriSpeech, так и вашу собственную запись. Если ваша запись имеет отличительные акустические особенности, о которых модель не знала до этого, она может не распознать вас должным образом.
- Процесс записи звука: Убедитесь, что условия записи звука для обучения и тестирования максимально сопоставимы. Различия в микрофонах, окружающем шуме и акустических условиях могут существенно повлиять на качество предсказания.
-
Качество предварительной обработки:
- Убедитесь, что процесс получения MFCC (мел-частотных кепстральных коэффициентов) для тестовых данных идентичен тому, что использовался для обучающего набора данных. Любые изменения в параметрах, таких как размер окна или шаг, могут негативно сказаться на результатах.
-
Недостаточная обобщаемость модели:
- Возможно, модель слишком хорошо адаптировалась к обучающим данным, что привело к переобучению. Это может проявляться тем, что точность на обучающем наборе данных значительно выше, чем на валидационном или тестовом.
Рекомендации по улучшению модели
Проверка и стандартизация данных
- Проверьте, чтобы все записи, используемые для тестирования, были аналогичны по признакам и были записаны при схожих условиях.
- Логируйте параметры предварительной обработки, чтобы подтвердить, что данные обрабатываются идентично.
Обогащение обучающего набора данных
- Попробуйте включить в обучающий набор данные, собранные в схожих условиях, но с различными говорящими. Это поможет модели лучше обобщить информацию и распознавать людей, которые не входили в предварительные обучающие наборы.
Регуляризация и структура модели
- Увеличьте уровень регуляризации, добавив слои Dropout или L2-регуляризацию в Dense-слоях.
- Рассмотрите возможность уменьшения количества параметров модели, например, сократив количество фильтров в свёрточных слоях или упрощая архитектуру.
Ретренинг и используя дополнительные данные
- Проведите повторное обучение модели, используя более разнообразные сэмплы, которые включают в себя записи вашего голоса в разных стилях и условиях. Это улучшит качество предсказаний для вашего голоса и, возможно, для других говорящих.
Оценка точности
- После внесения изменений в модель проверьте ее производительность на отдельных наборах тестовых данных. Оценивайте не только точность, но и другие метрики, такие как точность и полнота, чтобы получить всестороннюю оценку.
Заключение
Работа над моделью идентификации говорящего требует внимания к множественным аспектам, включая структуру модели и подготовку данных. Основная задача — добиться того, чтобы модель смогла успешно обобщать знания, полученные из обучающей выборки, чтобы точно предсказывать нового говорящего. Начните с проверки ваших процессов предварительной обработки, увеличения объема и разнообразия обучающих данных и оптимизации архитектуры нейронной сети. Постепенные корректировки и тестирования помогут в дальнейшем довести модель до нужного уровня точности.
Предложенные решения могут потребовать времени и усилий, однако они способны значительно улучшить результаты вашей модели и ее способность идентифицировать говорящих в разнообразных условиях.