2

저는 deeplearning4j 라이브러리를 처음 접했지만 일반적으로 신경 네트워크에 대한 경험이 있습니다.
저는 실시간으로 음악의 박자를 감지 할 것으로 예상되는 반복적 인 신경망 (특히 LSTM)을 훈련하려고합니다. 지금까지 발견 한 deeplearning4j로 반복적 인 신경망을 사용하는 모든 예는 파일에서 교육 데이터를 읽는 독자를 사용합니다. 마이크를 통해 실시간으로 음악을 녹음하기 때문에 미리 생성 된 파일을 읽을 수 없기 때문에 신경망에 입력되는 데이터는 응용 프로그램에서 실시간으로 생성됩니다. 런타임 동안 생성되는 데이터로 deeplearning4j의 반복적 인 신경망을 계발하십시오.

내가 내 네트워크를 생성하기 위해 사용하고 코드입니다 : 내가 (녹음 된 오디오의 대부분 FFT 데이터입니다) 약 700 입력을 사용하고이 경우

NeuralNetConfiguration.ListBuilder builder = new NeuralNetConfiguration.Builder() 
      .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1) 
      .learningRate(0.1) 
      .rmsDecay(0.95) 
      .regularization(true) 
      .l2(0.001) 
      .weightInit(WeightInit.XAVIER) 
      .updater(Updater.RMSPROP) 
      .list(); 

    int nextIn = hiddenLayers.length > 0 ? hiddenLayers[0] : numOutputs; 
    builder = builder.layer(0, new GravesLSTM.Builder().nIn(numInputs).nOut(nextIn).activation("softsign").build()); 

    for(int i = 0; i < hiddenLayers.length - 1; i++){ 
     nextIn = hiddenLayers[i + 1]; 
     builder = builder.layer(i + 1, new GravesLSTM.Builder().nIn(hiddenLayers[i]).nOut(nextIn).activation("softsign").build()); 
    } 

    builder = builder.layer(hiddenLayers.length, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT).nIn(nextIn).nOut(numOutputs).activation("softsign").build()); 

    MultiLayerConfiguration conf = builder.backpropType(BackpropType.TruncatedBPTT).tBPTTForwardLength(DEFAULT_RECURRENCE_DEPTH).tBPTTBackwardLength(DEFAULT_RECURRENCE_DEPTH) 
      .pretrain(false).backprop(true) 
      .build(); 

    net = new MultiLayerNetwork(conf); 
    net.init(); 

을, 1 개 출력 (이것은 0 [no beat]와 1 [beat] 사이의 숫자를 출력하기로되어 있음) 내 hiddenLayers 배열은 ints {50, 25, 10}로 구성됩니다. netInputData 일차원 이중 어레이와 같은 네트워크에 I를 입력 할 데이터이다

double[] output = new double[]{net.rnnTimeStep(Nd4j.create(netInputData)).getDouble(0)}; 

:

네트워크의 출력을 얻기 위해이 코드를 사용하고 있습니다.
필자는이 코드가 제대로 작동하는지 확신하지 못한다. 필자는이 코드를 그릴 때 something like this으로 보이는 훈련받지 않은 네트워크에 대한 결과물을 얻었으므로이 코드를 올바르게 사용한다고 확신한다.
그러나 일단 네트워크를 훈련하려고하면 (잠시 동안 훈련해도 네트워크의 무게가 약간 변경되어 출력이 훈련되지 않은 네트워크와 매우 유사해야 함) 출력은 looks like a constant입니다. 다시 한번

for(int timestep = 0; timestep < trainingData.length - DEFAULT_RECURRENCE_DEPTH; timestep++){ 
     INDArray inputDataArray = Nd4j.create(new int[]{1, numInputs, DEFAULT_RECURRENCE_DEPTH},'f'); 
     for(int inputPos = 0; inputPos < trainingData[timestep].length; inputPos++) 
      for(int inputTimeWindowPos = 0; inputTimeWindowPos < DEFAULT_RECURRENCE_DEPTH; inputTimeWindowPos++) 
       inputDataArray.putScalar(new int[]{0, inputPos, inputTimeWindowPos}, trainingData[timestep + inputTimeWindowPos][inputPos]); 

     INDArray desiredOutputDataArray = Nd4j.create(new int[]{1, numOutputs, DEFAULT_RECURRENCE_DEPTH},'f'); 
     for(int outputPos = 0; outputPos < desiredOutputData[timestep].length; outputPos++) 
      for(int inputTimeWindowPos = 0; inputTimeWindowPos < DEFAULT_RECURRENCE_DEPTH; inputTimeWindowPos++) 
       desiredOutputDataArray.putScalar(new int[]{0, outputPos, inputTimeWindowPos}, desiredOutputData[timestep + inputTimeWindowPos][outputPos]); 

     net.fit(new DataSet(inputDataArray, desiredOutputDataArray)); 
    } 

, I는 입력과 이중 배열로 원하는 출력 내 데이터를 가지고 :

내가 네트워크를 훈련을 위해 사용하고 코드입니다. 이번에는 두 개의 배열이 2 차원입니다. 첫 번째 인덱스는 시간 (인덱스 0은 녹음 된 오디오의 첫 번째 오디오 데이터 임)을 나타내고 두 번째 인덱스는이 시간 단계에 대한 입력 (또는 각각의 원하는 출력)을 나타냅니다.
네트워크 교육 후 표시된 출력을 볼 때 필자는 데이터에서 INDArrays를 작성하는 데 사용 된 코드에 문제가 있다고 생각하는 경향이 있습니다. 이러한 배열을 초기화하는 데 중요한 단계가 없거나 데이터를 배열에 넣어야하는 순서가 엉망이 되었습니까?

사전에 도움을 주셔서 감사합니다.

+0

우수 질문. 커뮤니티에 가입하십시오. 채널의 https://gitter.im/deeplearning4j/deeplearning4j 커미터가 당신을 도울 수 있습니다! – tremstat

답변

0

잘 모르겠지만 훈련 사례의 99.99 %는 0이며, 비트가 발생한 지점은 정확히 1 일뿐입니다. 이것은 배우기에는 너무 불균형 할 수 있습니다. 행운을 빕니다.