Несколько реальных входов и несколько реальных выходов в нейронной сети
Как я могу обучить персептрон, где есть несколько входных и выходных узлов, и оба являются действительными?
Я делаю это, потому что я хочу обучить нейронную сеть, чтобы предсказывать MFCC, учитывая некоторые точки данных (из сигнала).
Вот пример данных: http://pastebin.com/dtHGUeax Я не буду помещать данные здесь, потому что файл "большой".
Сейчас я использую nolearn, потому что позже я добавлю больше слоев для глубокого изучения.
net = NeuralNet(
layers=[('input', layers.InputLayer),
('output', layers.DenseLayer),
],
# Layer parameters
input_shape=(None, 256),
output_nonlinearity=lasagne.nonlinearities.softmax,
output_num_units=13,
# Optimization
update=nesterov_momentum,
update_learning_rate=0.01,
update_momentum=0.9,
regression=True,
max_epochs=500,
verbose=1
)
Уровень ошибок, которые я получаю при таком подходе, очень высок.
1 ответ
Извлечение MFCC из спектра мощности является нелинейной операцией, ее невозможно воспроизвести одним слоем. Если вы хотите воспроизвести его несколькими слоями, вам нужно рассмотреть сам алгоритм MFCC.
Извлечение MFCC может быть представлено следующей нейронной сетью:
- Слой 1 плотной матрицы размером 256х40 с логарифмической нелинейностью
- Плотная матрица 2-го уровня размером 40x13 без нелинейности (такая же, как линейная нелинейность или идентичная нелинейность в лазаньи)
Если вы воспроизведете эту сеть с помощью nolearn, она сможет правильно ее изучить, однако нелинейность логарифма еще не реализована в Lasagne, поэтому вам придется реализовать ее самостоятельно. Другим решением было бы заменить нелинейность логарифма на tanh или пару стандартных нелинейных слоев.
Таким образом, чтобы воспроизвести MFCC, вам нужно иметь 2 слоя с логарифмической нелинейностью или 3-4 слоя с, скажем, нелинейностью softmax, а последний слой должен быть настроен на линейную нелинейность.