2016-08-21 57 views
11

我经历了整个文档,没有找到如何设置RBF网络。我在ConsoleExmpales/Examples/Radial中发现了一些RBF示例,但它看起来不再起作用,因为在Encog中已经更改了一些方法。Encog C#RBF网络,如何启动?

到目前为止,我坚持这个:

public static double[][] XORInput = { 
     new[] {0.0, 0.0}, 
     new[] {1.0, 0.0}, 
     new[] {0.0, 1.0}, 
     new[] {1.0, 1.0} 
    }; 

    public static double[][] XORIdeal = { 
     new[] {0.0}, 
     new[] {1.0}, 
     new[] {1.0}, 
     new[] {0.0} 
    }; 

     int dimension = 8; 
     int numNeuronsPerDimension = 64; 
     double volumeNeuronWidth = 2.0/numNeuronsPerDimension; 
     bool includeEdgeRBFs = true; 

     RBFNetwork n = new RBFNetwork(dimension, numNeuronsPerDimension, 1, RBFEnum.Gaussian); 
     n.SetRBFCentersAndWidthsEqualSpacing(0, 1, RBFEnum.Gaussian, volumeNeuronWidth, includeEdgeRBFs); 
     //n.RandomizeRBFCentersAndWidths(0, 1, RBFEnum.Gaussian); 

     INeuralDataSet trainingSet = new BasicNeuralDataSet(XORInput, XORIdeal); 
     SVDTraining train = new SVDTraining(n, trainingSet); 

     int epoch = 1; 
     do 
     { 
      train.Iteration(); 
      Console.WriteLine("Epoch #" + epoch + " Error:" + train.Error); 
      epoch++; 
     } while ((epoch < 1) && (train.Error > 0.001)); 

当我跑,我得到错误“RBF神经元的总数必须有一些整数‘尺寸’的力量。”在SetRBFCentersAndWidthsEqualSpacing。如果我改变这个方法RandomizeRBFCentersAndWidths,直到train.iteration()到达,我得到“索引是在数组边界之外”。

我了解网络如何RBF工作,但我很困惑在SetRBFCentersAndWidthsEqualSpacing方法的所有参数,有人可以解释更详细?

回答

2

非常好的问题。

  1. SetRBFCentersAndWidthsEqualSpacingand here相对训练神经网络的新的方法和杰夫·希顿决定来实现它。
  2. 看起来像在第230-240行的Java versionC# version之间存在差异,并且IMHO错误位于Java版本中。

  3. 我修改你的代码,以便它是可行的补充评论:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using Encog.MathUtil.RBF; 
    using Encog.Neural.Data.Basic; 
    using Encog.Neural.NeuralData; 
    using Encog.Neural.Rbf.Training; 
    using Encog.Neural.RBF; 
    
    namespace TestRBF 
    { 
        class Program 
        { 
         public static double[][] XORInput = { 
         new[] {0.0, 0.0}, 
         new[] {1.0, 0.0}, 
         new[] {0.0, 1.0}, 
         new[] {1.0, 1.0} 
        }; 
    
         public static double[][] XORIdeal = { 
         new[] {0.0}, 
         new[] {1.0}, 
         new[] {1.0}, 
         new[] {0.0} 
        }; 
    
         static void Main(string[] args) 
         { 
          int dimension = 2; // XORInput provides two-dimensional inputs. Not 8. 
          /* 
          If XORInput is 8 dimensional it should be like this: 
    
          public static double[][] XORInput = { 
          new[] {0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0}, 
          . 
          . 
          .*/ 
          int numNeuronsPerDimension = 4; // could be also 16, 64, 256. I suppose it should accept 8, 32 but it needs additional investigation 
          double volumeNeuronWidth = 2.0/numNeuronsPerDimension; 
          bool includeEdgeRBFs = true; 
    
          RBFNetwork n = new RBFNetwork(dimension, numNeuronsPerDimension, 1, RBFEnum.Gaussian); 
          n.SetRBFCentersAndWidthsEqualSpacing(0, 1, RBFEnum.Gaussian, volumeNeuronWidth, includeEdgeRBFs); 
          //n.RandomizeRBFCentersAndWidths(0, 1, RBFEnum.Gaussian); 
    
          INeuralDataSet trainingSet = new BasicNeuralDataSet(XORInput, XORIdeal); 
          SVDTraining train = new SVDTraining(n, trainingSet); 
    
          int epoch = 1; 
          do 
          { 
           train.Iteration(); 
           Console.WriteLine("Epoch #" + epoch + " Error:" + train.Error); 
           epoch++; 
          } while ((epoch < 1) && (train.Error > 0.001)); 
    
         } 
        } 
    } 
    
+1

我忘了改变我的尺寸,2是正确的。感谢您指向numNeuronsPerDimension,现在它工作!我已经试过8,32,它不工作,所以只有16,64,256。 – EdWood

+1

WRT功率的尺寸是RBF中心和等宽度间距算法的要求 –

+0

我认为在232线上的.NET版本中存在一个错误: var expectedSideLength =(int)Math.Pow(totalNumHiddenNeurons,1.0d/dimensions); double cmp = Math.Pow(totalNumHiddenNeurons,1.0d/dimensions);如果(expectedSideLength!= cmp)这两个变量不能相等,因为“(int)”将该数字四舍五入。这是巧合,它适用于XOR示例,与19不同的dimenson它不会工作。 – EdWood