DL Keras - сырая речевая классификация переменной длины с 1 меткой на файл - PullRequest
0 голосов
/ 25 октября 2018

У меня проблемы с получением правильного выходного размера между слоями.

Фон

Мой набор данных существует из аудиофайлов .wav, которые различаются по длине, и имеет только количество меток, выводимых спроцент за класс эмоций.Я хочу иметь возможность общаться с речью в реальном времени после тренировки.Поэтому я подумал о подходе с раздвижными окнами к необработанному аудио.Я использую Keras и подумал об использовании TimeDistributed (), чтобы иметь возможность классифицировать все скользящие окна с 1 меткой.Подумайте о классификации видео (аудио файла) с 1 массивом выходных меток, подавая сеть кадр за кадром (скользящая оконная рамка скользящей оконной рамкой).

Пустой код

# Python 3
import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, TimeDistributed, Dense

# raw audio
wavs = [np.array([0.12, 0.43, 0.75]), np.array([0.32, 0.21, 0.64, 0.33])]
# x% emotion 1, x% emotion 2
labels = [np.array([0.4, 0.6]), np.array([0.9, 0.1])]

# Generator function for Keras
def data_generator():
    for i, wav in enumerate(wavs):
        wav_length = len(wav)
        # init empty array with shape (len wav / sliding window width, sliding ww)
        # sliding window of 1
        x = np.zeros([len(wav), 1])
        for idx in range(len(wav)):
            x[idx] = wav[idx]

        # LSTM reshape
        x = x.reshape(x.shape[0], 1, x.shape[1])

        y = labels[0]

        # 1 file == 1 batch
        yield(x, y)

gen = data_generator()
# Example: (array([[[0.12]], [[0.43]], [[0.75]]]), array([0.4, 0.6]))

def model_setup():
    input_shape = (None, 1, 1)

    # TimeDistributed
    model = Sequential()
    model.add(TimeDistributed(LSTM(128), input_shape=input_shape))
    model.add(TimeDistributed(Dense(2, activation='sigmoid')))  # emotion yes/no
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    return model

ks_model = model_setup()
model_hist = ks_model.fit_generator(gen, steps_per_epoch = 2,
                                 epochs = 1, verbose=2, class_weight=None)

Ошибки

Однако, независимо от того, изменю ли я x.reshape(x.shape[0], 1, x.shape[1]) на x.reshape(1, x.shape[0], 1, x.shape[1]) удалить или добавить TimeDistributed(), я не могу запустить его.

Ошибки похожи на: ValueError: Error when checking input: expected time_distributed_15_input to have 4 dimensions, but got array with shape (3, 1, 1)

Вдохновлен

Мой код написан на основе кода классификации видео, приведенного здесь: https://github.com/keras-team/keras/issues/5338#issuecomment-278844603

Однако, они переходят от слоя TimeDistributed к LSTM слой (который соответствует размерам).В моем случае я уже использую LSTM в TimeDistributed, поэтому я не могу использовать только LSTM, потому что размеры не совпадают.

Вопрос

Кто-нибудь знает, какполучить приведенный выше код для компиляции и обучения модели?

Различные подходы

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

Редактировать: Загруженный блокнот Jupyter

https://colab.research.google.com/drive/1C_aZcdUULT59i1jhSoB_dgqKp9JgpCH6

...