Keras Modeling - спектрограмма для классификации-последовательности
Я пытаюсь построить модель в керасе, которая передает последовательность, а также выплевывает последовательность. Я строил несколько моделей раньше, но ни одна из них не имела динамической длины ввода и длины вывода. Его для распознавания звуков (автомобиль, птица, голос). Моя проблема в том, что я не понимаю, как построить модель 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"]()]]
Что я делаю неправильно? я делаю это неправильно?