CTC модель не учится - PullRequest
       36

CTC модель не учится

0 голосов
/ 06 декабря 2018

Я пытаюсь запрограммировать модель Keras для транскрипции звука, используя временную классификацию соединений.Используя в основном работающую модель покадровой классификации и пример OCR , я придумал приведенную ниже модель, которую я хочу обучить отображению кратковременного преобразования Фурье немецких предложений в их фонетическую транскрипцию.

Мои данные об обучении на самом деле содержат информацию о времени, поэтому я могу использовать ее для обучения модели по кадрам без CTC.Модель прогнозирования по кадрам без потери CTC работает прилично (точность обучения 80%, точность проверки 50%).Тем не менее, существует гораздо больше потенциальных учебных данных без информации о времени, поэтому я действительно хочу сменить CTC.Чтобы проверить это, я удалил синхронизацию из данных, увеличил размер вывода на единицу для класса NULL и добавил функцию потери CTC.

Эта модель CTC, похоже, не изучает.В целом, потери не уменьшаются (они уменьшились с 2000 до 180 в дюжине эпох по 80 предложений каждое, но затем вернулись к 430), и максимальный выход вероятности, который он производит, составляет около 1007 * каждый из всехпредложения, которые обычно содержат около шести слов и транскрипции, такие как [foːɐmʔɛsndʰaɪnəhɛndəvaʃn] - [], являются частью последовательности, представляющей паузу в начале и конце аудио.

Мне трудно найти хорошие объясненияCTC в Керасе, так что может быть, я сделал что-то глупое.Я испортил модель, перепутав где-то порядок аргументов?Должен ли я быть более осторожным в обучении модели, начиная с аудио-фрагментов с одним, двумя или, может быть, тремя звуками, прежде чем дать модели законченные предложения?Короче говоря,

Как мне узнать эту модель CTC?

connector = inputs
for l in [100, 100, 150]:
    lstmf, lstmb = Bidirectional(
        LSTM(
            units=l,
            dropout=0.1,
            return_sequences=True,
        ), merge_mode=None)(connector)

    connector = keras.layers.Concatenate(axis=-1)([lstmf, lstmb])

output = Dense(
    units=len(dataset.SEGMENTS)+1,
    activation=softmax)(connector)

loss_out = Lambda(
    ctc_lambda_func, output_shape=(1,),
    name='ctc')([output, labels, input_length, label_length])

ctc_model = Model(
    inputs=[inputs, labels, input_length, label_length],
    outputs=[loss_out])
ctc_model.compile(loss={'ctc': lambda y_true, y_pred: y_pred},
                  optimizer=SGD(
                      lr=0.02,
                      decay=1e-6,
                      momentum=0.9,
                      nesterov=True,
                      clipnorm=5))

ctc_lambda_function и код для генерации последовательностей из предсказаний взят из OCRпример.

1 Ответ

0 голосов
/ 09 декабря 2018

Он полностью невидим из приведенного здесь кода, но в других местах OP дает ссылки на их Github-репозиторий .Ошибка на самом деле заключается в подготовке данных:

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

Решение этого состоит в том, чтобы масштабировать входные спектрограммы таким образом, чтобы они содержали как положительные, так и отрицательные значения:

for i, file in enumerate(files):
    sg = numpy.load(file.with_suffix(".npy").open("rb"))
    spectrograms[i][:len(sg)] = 2 * (sg-sg.min())/(sg.max()-sg.min()) - 1
...