У меня проблемы с получением правильного выходного размера между слоями.
Фон
Мой набор данных существует из аудиофайлов .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