0

ニューラル ネットワークの出力を計算する関数を作成したいと考えています。私の NN の要素は、19D 入力ベクトルと 19D 出力ベクトルです。50 ニューロンの隠れ層を 1 つ選択します。私のコードは次のとおりですが、正しく機能するかどうかはわかりません。

double *BuildPlanner::neural_tactics(){


    norm();  //normalize input vector
    ReadFromFile();   // load weights W1 W2 b1

    double hiddenLayer [50][1];


    for(int h=0; h<50; h++){
            hiddenLayer[h][0] =0;
            for(int f = 0; f < 19; f++){

                    hiddenLayer[h][0] = hiddenLayer[h][0] + W1[h][f]*input1[f][0];
            }
    }

    double HiddenLayer[50][1];

    for(int h=0; h<50; h++){
            HiddenLayer[h][0] = tanh(hiddenLayer[h][0] + b1[h][0]);
    }

    double outputLayer[50][1];

    for(int h=0; h<19; h++){
            for(int k=0; k<50; k++){
                    outputLayer[h][0] = outputLayer[h][0] + W2[h][k]*HiddenLayer[k][0];
            }
    }

    double Output[19];

    for(int h=0; h<19; h++){

            Output[h] = tanh(outputLayer[h][0]);
    }

    return Output;
}

実際、行列の乗算についてはよくわかりません。W1*input+b1 で、行列のサイズは 50x19 * 19x1 + 50x1 で、W2*outHiddenLayer は 19x50*50x1 です!

4

1 に答える 1

1

行列の乗算は私には問題ないように見えますが、他にも問題があります-`outputLayer は 50x1 ですが、a) 最初の 19 要素のみを反復し、b) 方程式の RHS にそれを持っています

outputLayer[h][0] = outputLayer[h][0] + W2[h][k]...

その要素が定義される前。それがあなたのすべての問題を引き起こしている可能性があります。outputLayerまた、マトリックスのように見えるように 2 次元を作成していると思いますが、2 次元のサイズが 1 の場合は完全に無償であり、速度が低下します。それと他の次元を次のように宣言するだけです

double outputLayer[50];

これはベクトルであり、それらは常に 1 次元であるため、実際にコードがより明確になります。

于 2012-09-04T18:15:43.580 に答える