2

私は Java で初めてのニューラル ネットワークを構築しており、この C++ の例をオンラインでフォローしています。

vector<double> CNeuralNet::Update(vector<double> &inputs)
{

//stores the resultant outputs from each layer

vector<double> outputs;

int cWeight = 0;

//first check that we have the correct amount of inputs

if (inputs.size() != m_NumInputs)
{
    //just return an empty vector if incorrect.
    return outputs;
}
//For each layer....

for (int i=0; i<m_NumHiddenLayers + 1; ++i)
{
    if ( i > 0 )
    {
        inputs = outputs;
    }
outputs.clear();
cWeight = 0;

//for each neuron sum the (inputs * corresponding weights).Throw
//the total at our sigmoid function to get the output.

for (int j=0; j<m_vecLayers[i].m_NumNeurons; ++j)
{
  double netinput = 0;


  int NumInputs = m_vecLayers[i].m_vecNeurons[j].m_NumInputs;


  //for each weight

  for (int k=0; k<NumInputs - 1; ++k)
  {

    //sum the weights x inputs

    netinput += m_vecLayers[i].m_vecNeurons[j].m_vecWeight[k] *

                inputs[cWeight++];
  }


  //add in the bias

  netinput += m_vecLayers[i].m_vecNeurons[j].m_vecWeight[NumInputs-1] *

              CParams::dBias;



  //we can store the outputs from each layer as we generate them.

  //The combined activation is first filtered through the sigmoid

  //function

  outputs.push_back(Sigmoid(netinput, CParams::dActivationResponse));



  cWeight = 0;

}

}

return outputs;

}

このコードに関して 2 つの質問があります。まず、一見すると...出力への入力の奇妙な割り当て

//For each layer....

for (int i=0; i<m_NumHiddenLayers + 1; ++i)

{

if ( i > 0 )

{ 

    inputs = outputs;

}
outputs.clear();

この部分は本当に私を混乱させます。彼は出力を作成したばかりです...なぜ彼は出力を入力に割り当てるのでしょうか? また、なぜ ++i なのですか? 私が知る限り、これより前の彼のコードでは、彼はまだインデックス [0] を使用しています。これは私が行っていることです。なぜ突然の変更?この最後のものを残す理由はありますか?これは、残りのコード例がないとわかりにくい質問かもしれません...

私の2番目の質問は

//add in the bias

netinput += m_vecLayers[i].m_vecNeurons[j].m_vecWeight[NumInputs-1] *

          CParams::dBias;



//we can store the outputs from each layer as we generate them.

//The combined activation is first filtered through the sigmoid

//function

outputs.push_back(Sigmoid(netinput, CParams::dActivationResponse));

CParams::dBias と CParams::dActivationResponse は、この前には現れません。このためにサブインする 2 つの静的最終グローバルを作成しました。私は正しい軌道に乗っていますか?

どんな助けでも大歓迎です。これは個人的なプロジェクトであり、2 週間前に初めて知って以来、このテーマについて考えるのをやめることができませんでした。

4

3 に答える 3

2

私は@kohakukunに同意し、彼の答えに私の答えを追加したいと思います。私が見るように、ニューラルネットワークの次の層の出力を計算するために、出力が入力に割り当てられています。私が取り組んでいるネットワークのように、複数のレイヤーを持つことができます。私のプロジェクトでは複数の隠しレイヤーがあり、コードを見ると、ここで同様の配置になっている可能性があります。したがって、私たちの回答をあなたのコードに関連付けることができ、おそらくあなたの疑問をある程度解決できると思います.

于 2014-05-02T12:40:18.933 に答える
0

for ステートメントでは、ループが再び開始される前に 3 番目の部分が実行されません。つまり、 for (int i=0; i<10; ++i) は for (int i=0; i <10; i++)。i>0 'inputs = outputs;' の場合のみ、正しい動作ではありませんか? CParams はクラスまたは名前空間の名前である必要があり、プロジェクト全体のどこかに存在する必要があります。クラス名であればglobal staticでもいいと思います。

于 2013-02-17T03:03:09.160 に答える
0

最初の質問については、生成されたばかりの出力を入力に割り当てて、ニューラル ネットワークを後方誘導で改良し、学習できるようにします。

2 番目の質問: 反復ごとにバイアスが変化しないため、正しい方向に進んでいると思います

于 2013-02-17T03:10:27.663 に答える