

/// <summary>
/// 根据期望的输出和实际的输出来调整权值
/// </summary>
/// <param name="targOut">期望的输出</param>
private void train_network(double[] outputs)
{
//get momentum values (delta values from last pass)
double[] delta_hidden = new double[_nn.NumberOfHidden + 1];
double[] delta_outputs = new double[_nn.NumberOfOutputs];
// Get the delta value for the output layer
for (int i = 0; i < _nn.NumberOfOutputs; i++)
{
delta_outputs=
_nn.Outputs * (1.0 - _nn.Outputs) * (outputs - _nn.Outputs);
}
// Get the delta value for the hidden layer
for (int i = 0; i < _nn.NumberOfHidden + 1; i++)
{
double error = 0.0;
for (int j = 0; j < _nn.NumberOfOutputs; j++)
{
error += _nn.HiddenToOutputWeights[i, j] * delta_outputs[j];
}
delta_hidden = _nn.Hidden * (1.0 - _nn.Hidden) * error;
}
// Now update the weights between hidden & output layer
for (int i = 0; i < _nn.NumberOfOutputs; i++)
{
for (int j = 0; j < _nn.NumberOfHidden + 1; j++)
{
//use momentum (delta values from last pass),
//to ensure moved in correct direction
_nn.HiddenToOutputWeights[j, i] += _nn.LearningRate * delta_outputs * _nn.Hidden[j];
}
}
// Now update the weights between input & hidden layer
for (int i = 0; i < _nn.NumberOfHidden; i++)
{
for (int j = 0; j < _nn.NumberOfInputs + 1; j++)
{
//use momentum (delta values from last pass),
//to ensure moved in correct direction
_nn.InputToHiddenWeights[j, i] += _nn.LearningRate * delta_hidden * _nn.Inputs[j];
}
}
}