Encog C# RBF网络,如何开始?

11

我浏览了整个文档,但没有找到如何设置RBF网络的方法。在ConsoleExamples/Examples/Radial中找到了一些RBF示例,但是看起来它不再起作用了,因为Encog中的一些方法已经更改。

目前我被卡住了:

    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));
当我运行此代码时,SetRBFCentersAndWidthsEqualSpacing 方法会报错提示 "总的RBF神经元数量必须是某个整数的 'dimensions' 次幂."。如果我将此方法更改为 RandomizeRBFCentersAndWidths,直到达到 train.iteration(),则代码可以正常工作,但在那一步之后,会出现 "数组索引超出范围" 的错误提示。
我了解 RBF 网络的工作原理,但是对于 SetRBFCentersAndWidthsEqualSpacing 方法中的所有参数感到困惑,是否有人能够更详细地解释一下?
1个回答

2
非常好的问题。
  1. SetRBFCentersAndWidthsEqualSpacing and here is relatively new method of training neural networks and Jeff Heaton decided to implement it.
  2. Looks like there is a difference between Java version and C# version at lines 230 - 240 and IMHO bug sits in Java version.

  3. I've modified your code in order for it to be workable with additional comments:

    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
关于RBF中心和等宽间距算法的要求,与维度的幂次有关。 - Yuriy Zaletskyy
我认为.NET版本的第232行存在一个bug:var expectedSideLength = (int) Math.Pow(totalNumHiddenNeurons, 1.0d/dimensions); double cmp = Math.Pow(totalNumHiddenNeurons, 1.0d/dimensions); 如果expectedSideLength和cmp这两个变量不相等,那是因为"(int)"会对数字进行四舍五入。XOR示例可能偶然能够工作,但如果维度不同,例如19,则无法正常工作。 - EdWood
我建议为那个问题创建另一个SO线程。希望Jeff Heaton能加入我们的分析。 - Yuriy Zaletskyy
我已经创建了一个新的线程,但我不确定Jeff Heaton是否仍在这个项目上工作。http://stackoverflow.com/questions/40072675/encog-rbf-c-total-number-of-rbf-neurons-must-be-some-integer-to-the-power-of - EdWood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接