我正在用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?据我所知,在他之前的代码中,他仍然使用index [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在此之前不会出现在任何地方。我现在为此创建了两个静态最终全局变量。我是在正确的轨道上吗?
任何帮助将不胜感激。这是一个个人项目,自从两周前我第一次了解这个问题以来,我一直无法停止思考这个问题。
答案 0 :(得分:2)
我同意@kohakukun,我想用他的答案添加我的答案。正如我所看到的,输出被分配给输入以计算下一层神经网络的输出。 有时在我正在处理的网络中,我们可以有多个图层,在我的项目中,我有多个隐藏图层,并查看您的代码,它可能在此处具有类似的排列。因此,我认为您可以将我们的答案与您的代码联系起来,并且可能会在一定程度上解决您的疑问。
答案 1 :(得分:0)
在for语句中,第3部分将不再在循环开始之前执行,这意味着,for(int i = 0; i&lt; 10; ++ i)将与for(int i =)完全相同0; i&lt; 10; i ++)。只有当i> 0'输入=输出;'时,它才是正确的行为吗? CParams应该是类或命名空间名称,它必须存在于整个项目的某个位置。如果是类名,我认为使用global static是可以的。
答案 2 :(得分:0)
对于您的第一个问题:您使用刚生成的输出分配输入以使用反向归纳来优化您的神经网络,以便它可以学习。
对于第二个问题:我认为你是在正确的轨道,因为偏差不会随着每次迭代而改变