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;

}

关于这段代码,我有两个问题。首先,看似……奇怪的输入到输出的分配

//For each layer....

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

{

if ( i > 0 )

{ 

    inputs = outputs;

}
outputs.clear();

这部分真的让我很困惑。他刚刚创建了输出……他为什么要将输出分配给输入?另外,为什么要++i?据我所知,在他之前的代码中,他仍然使用索引 [0],这就是我正在做的事情。为什么突然改变?有理由留下最后一个吗?我知道如果没有其余的代码示例,这可能是一个很难看到的问题......

我的第二个问题是

//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 不会出现在此之前的任何位置。我现在为此创建了两个静态最终全局变量。我在正确的轨道上吗?

任何帮助,将不胜感激。这是一个个人项目,自从两周前我第一次了解到这个主题以来,我一直无法停止思考这个主题。

4

3 回答 3

2

我同意@kohakukun,我想在他的答案中加上我的答案,正如我所看到的,输出被分配给输入以计算下一层神经网络的输出。有时就像在我正在处理的网络中一样,我们可以有多个层,在我的项目中我有多个隐藏层,并且查看您的代码它可能在这里有类似的安排。因此,我认为您可以将我们的答案与您的代码联系起来,并且可能会在一定程度上解决您的疑问。

于 2014-05-02T12:40:18.933 回答
0

对于您的第一个问题:您将输入与刚刚生成的输出一起分配,以通过反向归纳来完善您的神经网络,以便它可以学习。

对于第二个问题:我认为你在正确的轨道上,因为偏差不会随着每次迭代而改变

于 2013-02-17T03:10:27.663 回答
0

在 for 语句中,第三部分不会在循环再次开始之前执行,这意味着 for (int i=0; i<10; ++i) 将与 for (int i=0; i <10;i++)。只有当 i>0 'inputs = outputs;' 时,这不是正确的行为吗?CParams 应该是一个类或命名空间名称,它必须存在于整个项目的某个位置。如果是类名,我认为使用全局静态是可以的。

于 2013-02-17T03:03:09.160 回答