java machine-learning audio-processing deeplearning4j

java - deeplearning4j-utilizando un RNN/LSTM para el procesamiento de la señal de audio



machine-learning audio-processing (1)

Estoy tratando de entrenar un RNN para procesamiento de señal digital (audio) usando deeplearning4j. La idea es tener 2 archivos .wav: uno es una grabación de audio, el segundo es la misma grabación de audio pero procesada (por ejemplo, con un filtro de paso bajo). La entrada del RNN es la primera grabación de audio (sin procesar), la salida es la segunda grabación de audio (procesada).

He usado GravesLSTMCharModellingExample de los ejemplos de dl4j, y en su mayoría he adaptado la clase CharacterIterator para aceptar datos de audio en lugar de texto.

Mi primer proyecto para trabajar con audio con dl4j es básicamente hacer lo mismo que GravesLSTMCharModellingExample pero generar audio en lugar de texto, trabajando con audio mono de 11025Hz 8 bit, que funciona (para algunos resultados bastante divertidos). Entonces, los conceptos básicos de cómo trabajar con audio en este contexto parecen funcionar.

Así que el paso 2 fue adaptar esto para el procesamiento de audio en lugar de la generación de audio.

Lamentablemente, no estoy teniendo mucho éxito. Lo mejor que parece poder hacer es generar una versión muy ruidosa de la entrada.

Como una ''verificación de cordura'', he probado utilizando el mismo archivo de audio para la entrada y la salida, que esperaba converger rápidamente a un modelo simplemente copiando la entrada. Pero no es así Nuevamente, después de un largo tiempo de entrenamiento, todo lo que parecía poder hacer era producir una versión más ruidosa de la entrada.

Creo que el fragmento de código más relevante es el método DataSetIterator.next () (adaptado de la clase CharacterIterator del ejemplo), que ahora se ve así:

public DataSet next(int num) { if (exampleStartOffsets.size() == 0) throw new NoSuchElementException(); int currMinibatchSize = Math.min(num, exampleStartOffsets.size()); // Allocate space: // Note the order here: // dimension 0 = number of examples in minibatch // dimension 1 = size of each vector (i.e., number of characters) // dimension 2 = length of each time series/example // Why ''f'' order here? See http://deeplearning4j.org/usingrnns.html#data // section "Alternative: Implementing a custom DataSetIterator" INDArray input = Nd4j.create(new int[] { currMinibatchSize, columns, exampleLength }, ''f''); INDArray labels = Nd4j.create(new int[] { currMinibatchSize, columns, exampleLength }, ''f''); for (int i = 0; i < currMinibatchSize; i++) { int startIdx = exampleStartOffsets.removeFirst(); int endIdx = startIdx + exampleLength; for (int j = startIdx, c = 0; j < endIdx; j++, c++) { // inputIndices/idealIndices are audio samples converted to indices. // With 8-bit audio, this translates to values between 0-255. input.putScalar(new int[] { i, inputIndices[j], c }, 1.0); labels.putScalar(new int[] { i, idealIndices[j], c }, 1.0); } } return new DataSet(input, labels); }

Así que tal vez estoy teniendo un malentendido fundamental de lo que se supone que deben hacer las LSTM. ¿Hay algo obviamente mal en el código publicado que me falta? ¿Hay alguna razón obvia por la cual la capacitación en el mismo archivo no necesariamente converge rápidamente a un modelo que solo copia la entrada? (y mucho menos tratar de entrenarlo en el procesamiento de la señal que realmente hace algo?)

He visto Usar RNN para recuperar la onda sinusoidal de una señal ruidosa que parece tratarse de un problema similar (pero con un marco de ML diferente), pero no obtuvo una respuesta.

Cualquier comentario es apreciado!


hola, creo que en la lógica de un conjunto de datos intente utilizar un tipo largo en lugar de un número entero

public DataSet next(int num)

reemplazar a

public DataSet next(long num)