Keras Modeling - спектрограмма для классификации-последовательности - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь построить модель в кератах, которая передает последовательность, а также выплевывает последовательность.Я строил несколько моделей раньше, но ни одна из них не имела динамической длины ввода и длины вывода.Его для распознавания звуков (автомобиль, птица, голос).Моя проблема в том, что я не понимаю, как построить модель keras, чтобы иметь динамическую длину ввода и динамическую длину вывода. Длина ввода и длина вывода не должны быть связаны, и порядок важен!

Пример

Чтобы лучше это понять, у меня есть очень простой пример

x_train - спектрограмма wav-файла (динамическая длина!). Пример с разрешением частоты 28 выборок:

Dataset A: (300,28) --> 300 samples spectrogram of voice, bird and car at the end
Dataset B: (200,28) --> 200 samples spectrogram of a car in beginning and at the end
Dataset C: (333,28) --> 333 samples spectrogram of a car in the first seconds and some voice after the car

y_train - последовательностьГорячо закодированные этикетки.Каждый ярлык - это машина, голос или птица.Если спектрограмма получила автомобиль в первые 2 секунды и голос в последние секунды, то вывод меток также должен быть в том же порядке.Пример:

Dataset A: [[0,0,1],[0,1,0],[1,0,0]] = Recognized in order: Voice, Bird, Car
Dataset B: [[1,0,0],[1,0,0]] = Recognized in order: Car, Car
Dataset C: [[1,0,0],[0,0,1]] = Recognized in order: Car, Voice

Что у меня есть

Вначале я искал похожие примеры.Я нашел только примеры с фиксированной длиной последовательности или без динамического списка вывода.Затем я нашел DeepSpeech от Mozilla (Githublink) , который в основном является моделью Tensorflow для речевого распознавания.Он работает со встроенными во времени CNN спектрограммы и шестью скрытыми слоями.В конце его в состоянии обнаружить слова.Дополнительная информация: Исследовательская работа DeepSpeech

Проблема в том, что она написана с использованием Tensorflow (я знаю только keras) и даже с исходным кодом, я не могу понять, как это возможновыплюнуть другую длину последовательности, чем длина последовательности ввода.

Текущая модель

Моя текущая модель выглядит следующим образом:

model = Sequential()
model.add(LSTM(200, return_sequences=True, input_shape=(None,28)))
model.add(LSTM(3, return_sequences=True))

Как вы можете видеть,это всего два LSTM.Первая ячейка получила input_shape = (None, 28) для длины динамического ввода.Проблема в том, что если я введу (300,28), то форма вывода будет автоматически (300,3).Но y_train_label, например, (3,3).Означает, что я получаю следующую ошибку:

InvalidArgumentError: Incompatible shapes: [1,3,3] vs. [1,300,3]
     [[{{node loss_10/lstm_29_loss/mul}} = Mul[T=DT_FLOAT, _class=["loc:@training_10/Adam/gradients/loss_10/lstm_29_loss/mul_grad/Reshape_1"], _device="/job:localhost/replica:0/task:0/device:GPU:0"](_arg_lstm_29_target_0_1/_741, loss_10/lstm_29_loss/Log)]]
     [[{{node loss_10/mul/_765}} = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_3107_loss_10/mul", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

Что я делаю не так?я делаю это неправильно?

...