2016-10-25 16 views
1

ここでは、私のコードに2つの行列乗算があります。最初のものは正常に動作しますが、2番目のものは私に「ナノ」出力を与えます。行列乗算の結果が 'nan'

Sigmoide:

double sigmoide(double value) { 
    return 1.0/(1.0 + exp(-value)); 
} 

初期化:-0.5と0.5の間の

double LO = -0.5; 
double HI = 0.5; 

double input[50][2];       
double hiddenWeights[2][10];     
double outputWeights[11][1];     
double hiddenResults[50][11];     
double outputResults[50][1];          

for (int i = 0; i < 50; i++) { 
    input[i][0] = 1.0f;      /// Bias 
    input[i][1] = (7.0f/50.0f) * (double)i; /// Samples 
} 

for (int i = 0; i < 50; i++) { 
    outputSetpoint[i][0] = sin((7.0f/50.0f) * (double)i); 
} 

乱数値:

for (int i = 0; i < 2; i++) { 
    for (int j = 0; j < 10; j++) { 
     hiddenWeights[i][j] = LO + static_cast <float> (rand()) /(static_cast <float> (RAND_MAX/(HI-LO))); 
    } 
} 

for (int i = 0; i < 11; i++) { 
    for (int j = 0; j < 1; j++) { 
     outputWeights[i][j] = LO + static_cast <float> (rand()) /(static_cast <float> (RAND_MAX/(HI-LO))); 
    } 
} 

マトリックス乗算:

for (int s = 0; s < 50; s++) { 
    for (int j = 0; j < 10; j++) { 
     for (int i = 0; i < 2; i++) { 
      // First matrix-multiplication 
      hiddenResults[s][j] += nexttowardf(input[s][i] * hiddenWeights[i][j], 0.0f);    
     } 
     hiddenResults[s][10] = 1.0f;            
     hiddenResults[s][j] = sigmoide(hiddenResults[s][j]);      
    } 

    for (int j = 0; j < 1; j++) { 
     for (int i = 0; i < 11; i++) { 
      // Second matrix-multiplication 
      outputResults[s][j] += hiddenResults[s][i] * outputWeights[i][j]; 
     }                   
     outputResults[s][j] = sigmoide(outputResults[s][j]);      
     error = outputSetpoint[s][j] - outputResults[s][j]; 
    } 

    std::cout << outputResults[s][0] << std::endl; 
} 

出力:

nan 
1 
0.287491 
0.432262 
0.293168 
0.336324 
0.283587 
0.282668 
1 
0.333261 
nan 
0.279217 
nan 
0.239026 
0 
0.338551 
0.274522 
0.209411 
0.24247 
0.273364 
0.179109 
0.199499 
0.271506 
1 
nan 
nan 
nan 
nan 
+0

初期化されていないときは、 'outputResults'を使用しているようです。 –

+0

また、 'outputResults'を' double outputResults [50] [1]; '?なぜ単純に 'double outputResults [50];'?なぜ余分な「ディメンション」ですか? –

+0

ありがとうございます、初期化作業。余分なディメンソンは、複数の出力に対して使用されます。まだ実装されていません。 –

答えて

1

あなたがhiddenResultsoutputResults

はそれを行う初期化するのを忘れ:あなたはそれでいる間

double hiddenResults[50][11] = {0}; 
double outputResults[50][1] = {0}; 

は、他の変数を初期化。
これは良い習慣です。

+0

ありがとうございました。それはうまくいく! –