2017-05-06 6 views
11

deeplearning4jを使用してデジタル(オーディオ)信号処理用のRNNをトレーニングしようとしています。 2つの.wavファイルを用意することが考えられます.1つはオーディオ録音であり、2つ目は同じオーディオ録音ですが、(ローパスフィルターなどで)処理されます。 RNNの入力は第1の(未処理)オーディオ録音であり、出力は第2の(処理済み)オーディオ録音です。deeplearning4j - オーディオ信号処理にRNN/LSTMを使用する

私は、dl4jの例からGravesLSTMCharModellingExampleを使いました。ほとんどの場合、CharacterIteratorクラスはテキストの代わりにオーディオデータを受け入れるように変更されました。

dl4jでオーディオを使用する最初のプロジェクトは、基本的にGravesLSTMCharModellingExampleと同じことを行いますが、テキストの代わりにオーディオを生成し、11025Hzの8ビットモノラルオーディオで作業します(これはかなり面白い結果になります)。このような状況でオーディオを扱う基本はうまくいくようです。

ので、ステップ2の代わりに、オーディオ世代のオーディオ処理のためにこれを適応させることでした。

残念ながら、私は多くの成功を収めていません。 できるだけ良いと思われるのは、入力の非常に騒々しいバージョンを出力することです。

「健全性チェック」として、入力と出力の両方に同じオーディオファイルを使用してテストしましたが、これは入力をコピーするだけのモデルにすばやく収束すると考えました。しかし、それはしません。繰り返しますが、長時間のトレーニングの後、入​​力のノイズの多いバージョンを生成することができると思われるすべてのことが行われます。

私は推測するコードの最も関連性の高い作品は次のようになり(例のたCharacterIteratorクラスから適応)DataSetIterator.next()メソッド、次のとおりです。

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

に置き換える代わりに整数

public DataSet next(int num) 

のlong型を使用しようと、あなたはあなたのプロジェクトについては、次の点に答えることはできますか? LSTMネットワークアーキテクチャを使用する理由ガイダンスを提供することに関連することは、入力をバッチ処理する方法を見ることにもなります。どんなタイプの正規化を行っていますか? – Nathan

+0

LSTMを使用する背後にある私の考えは、そのデータの順序が重要なデータを勉強していて、NNが以前に処理されたデータ(通常のFF NNのようなもの)から何かを学ぶことを期待しています。 – erikd71

+0

バッチ処理については、ミニバッチサイズ32、サンプルサイズ10000、TBPTT長1000を使用しています(ただし、これらの値を多く試していますが)。 – erikd71

答えて

1

こんにちは私は、データセットのロジックで考えること

public DataSet next(long num) 
+0

それはDataSetIteratorインターフェイスに違反し、私はそれがどのように問題に関係しているかわかりません。 – erikd71

関連する問題