2017-05-06 211 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