星辰.Net技术社区论坛

首页 » .NET » 算法/数据结构 » C#实现多层人工神经网络
admin - 2008-6-24 14:24:00
1 介绍ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
求异或(XOR)操作是计算机中常用到的一种计算:ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
0 XOR 0 = 0 ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
0 XOR 1 = 1ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
1 XOR 0 = 1ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
1 XOR 1 = 0ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
我们可以使用第一篇文章中的代码来计算这个结果(需要修改其中的训练集),可以发现学习后的结果不能让我们满意,原因是单层神经网络学习能力有限,需要使用更加复杂的网络来学习。ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
在这一篇文章中,我们将使用一个新的多层神经网络来学习。ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
2 范例程序的使用和说明ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
该程序的使用说明和C#单层人工神经网络类似,可以参考ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
但是多了一个计算操作(XOR),如图:ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢

ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
3 网络结构ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
该多层神经网络在单层神经网络的基础上增加了一层“隐藏层”(Hidden)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢

ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
4 学习算法ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
基本的原理就是用实际网络计算出来的值和期望的值进行比较,然后来调整自己的权值。ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        /// <summary>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
/// 根据期望的输出和实际的输出来调整权值ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
/// </summary>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
/// <param name="targOut">期望的输出</param>ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        private void train_network(double[] outputs)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
       
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
//get momentum values (delta values from last pass)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
double[] delta_hidden = new double[_nn.NumberOfHidden + 1];ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
double[] delta_outputs = new double[_nn.NumberOfOutputs];ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
// Get the delta value for the output layerÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
for (int i = 0; i < _nn.NumberOfOutputs; i++)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                delta_outputs
=ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                    _nn.Outputs
* (1.0 - _nn.Outputs) * (outputs - _nn.Outputs);ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            }
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
// Get the delta value for the hidden layerÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
for (int i = 0; i < _nn.NumberOfHidden + 1; i++)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
               
double error = 0.0;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
               
for (int j = 0; j < _nn.NumberOfOutputs; j++)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
               
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                    error
+= _nn.HiddenToOutputWeights[i, j] * delta_outputs[j];ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                }
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                delta_hidden
= _nn.Hidden * (1.0 - _nn.Hidden) * error;ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            }
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
// Now update the weights between hidden & output layerÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
for (int i = 0; i < _nn.NumberOfOutputs; i++)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
               
for (int j = 0; j < _nn.NumberOfHidden + 1; j++)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
               
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                   
//use momentum (delta values from last pass), ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                   
//to ensure moved in correct directionÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                    _nn.HiddenToOutputWeights[j, i] += _nn.LearningRate * delta_outputs * _nn.Hidden[j];ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                }
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            }
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
// Now update the weights between input & hidden layerÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
for (int i = 0; i < _nn.NumberOfHidden; i++)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
           
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
               
for (int j = 0; j < _nn.NumberOfInputs + 1; j++)ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
               
{ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                   
//use momentum (delta values from last pass), ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                   
//to ensure moved in correct directionÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                    _nn.InputToHiddenWeights[j, i] += _nn.LearningRate * delta_hidden * _nn.Inputs[j];ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
                }
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
            }
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
        }ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢
ÒA:<>§ÒÄ}¸www.netcsharp.cnDŽݑ£¯Cû¢

附件: ann2.rar
1
查看完整版本: C#实现多层人工神经网络