2017-05-06 84 views
11

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

我已经使用了dl4j示例中的GravesLSTMCharModellingExample,并且大多使用CharacterIterator类来接受音频数据而不是文本。

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

所以第2步是为了适应音频处理而不是音频

不幸的是,我没有太大的成功。 它似乎能够做的最好的是输出一个非常嘈杂的输入版本。

作为一项“健康检查”,我已经对输入和输出使用相同的音频文件进行了测试,我希望能够快速收敛到模型,只需复制输入。但事实并非如此。再次,在经过长时间的训练之后,所有似乎能够做到的都是产生噪音较大的输入。

最相关的代码我猜是DataSetIterator.next()方法(改编自例子的CharacterIterator进行类),现在看起来是这样的:

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应该做的事情。 发布代码中有什么明显错误,我错过了? 是否有一个显而易见的原因,为什么在同一个文件上进行训练不一定会快速收敛到只复制输入的模型? (更不用说,甚至试图训练它在信号处理,实际上做什么?)

我见过Using RNN to recover sine wave from noisy signal这似乎是关于类似的问题(但使用不同的ML框架),但没有得到回答。

任何反馈意见是赞赏!

+2

你能回答以下关于你的项目?为什么要使用LSTM网络架构?与提供指导相关的还有看你如何分配投入。你正在执行任何类型的规范化吗? – Nathan

+0

我使用LSTM的思想是,我正在训练数据的顺序,这些数据的顺序很重要,我希望NN能从之前处理的数据中学到一些东西(不像'正常'FF NN)。 – erikd71

+0

至于配料,我使用的最小批量为32,实例大小为10000,TBPTT长度为1000(尽管我正在用这些值进行大量试验)。 – erikd71

回答

1

你好,我想在一个数据集的逻辑尽量使用长型而不是整数

public DataSet next(int num) 

的替换对

public DataSet next(long num) 
+0

这将违反DataSetIterator接口,我不知道这与问题无关。 – erikd71