deeplearning4j - 使用RNN/LSTM进行音频信号处理

我正在尝试使用deeplearning4j训练用于数字(音频)信号处理的RNN。这个想法是有2个.wav文件:一个是音频录制,第二个是相同的录音,但经过处理(例如使用低通滤波器)。RNN的输入是第一次(未处理)音频录制,输出是第二次(处理)音频记录。

我使用了dl4j示例中的GravesLSTMCharModellingExample,并且主要调整了CharacterIterator类以接受音频数据而不是文本。

我使用dl4j处理音频的第一个项目基本上是与GravesLSTMCharModellingExample做同样的事情,但生成音频而不是文本,使用11025Hz 8位单声道音频,这有效(到一些非常有趣的结果)。因此,在这种情况下处理音频的基础知识似乎有效。

因此,第2步是将其调整为音频处理而不是音频生成

不幸的是,我没有取得多大成功。它似乎能做的最好的事情就是输出一个非常嘈杂的输入版本。

作为“健全性检查”,我对输入和输出使用相同的音频文件进行了测试,我希望它能快速收敛到一个简单地复制输入的模型上。但事实并非如此。同样,经过长时间的训练,它似乎所能做的就是产生一个更嘈杂的输入版本。

我想最相关的代码段是DataSetIterator.next()方法(改编自示例的CharityIterator类),现在看起来像这样:

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);
}

因此,也许我对LSTM应该做什么有根本性的误解。我丢失的发布代码中是否有任何明显的错误?为什么在同一文件上进行训练不一定能快速收敛到仅复制输入的模型,这有什么明显的原因吗?(更不用说尝试在实际执行某些操作的信号处理上对其进行训练了?

我见过使用RNN从嘈杂的信号中恢复正弦波,这似乎是一个类似的问题(但使用不同的ML框架),但这没有得到答案。

任何反馈是值得赞赏的!


答案 1

如果您听到输入的失真版本,那么您就走在正确的道路上。

问题可能是网络的可用参数在少量示例上无法很好地泛化。确保你有更多的样本,至少50_000个彼此不重叠(不是来自同一个wav文件),并尝试使用网络参数,例如尝试将每层上的节点减少10-15%,并尝试较低的学习率。


答案 2

此类问题最常见的问题是训练数据。

  1. 确保有足够的可用训练数据。如果没有,您可以使用像音频mentations这样的库来增强您的训练集。
  2. 训练数据的多样性。可以添加到训练集中的扰动越多越好。
  3. 超参数优化 - 神经网络通常需要大量参数调整才能执行高于平均水平的性能。深度学习中的参数优化4j
  4. 这是根据过去的经验提出的建议。它可能超出了范围,但自动编码器架构通常为这些处理用例创造了奇迹。(音频、图像等)

推荐