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
初期化されていないときは、 'outputResults'を使用しているようです。 –
また、 'outputResults'を' double outputResults [50] [1]; '?なぜ単純に 'double outputResults [50];'?なぜ余分な「ディメンション」ですか? –
ありがとうございます、初期化作業。余分なディメンソンは、複数の出力に対して使用されます。まだ実装されていません。 –