Ejemplo n.º 1
0
        public void PropagateSignalAfterWeightsChanged()
        {
            const int inputs = 2;
            var hidden = new[] { 2, 2 };
            const int outputs = 2;
            Func<double, double> activation = x => x;
            var net = new SimpleFuzzyNet(inputs, hidden, () => new RealNumber(0.0), activation, outputs);

            var input = new List<IFuzzyNumber>
                {
                    new RealNumber(1.0),
                    new RealNumber(2.0),
                };
            var weights = new Vector(new IFuzzyNumber[]
                {
                    //output layer
                    //first neuron
                    new RealNumber(2.0),
                    new RealNumber(2.0),
                    //second neuron
                    new RealNumber(4.0),
                    new RealNumber(2.0),

                    //hidden 1
                    new RealNumber(1.0),
                    new RealNumber(-1.5),
                    new RealNumber(2.0),
                    new RealNumber(1.0),

                    //hidden 2
                    new RealNumber(-1.0),
                    new RealNumber(-1.0),
                    new RealNumber(2.0),
                    new RealNumber(-1.0),
                });

            net.SetWeights(weights);
            var output = net.Propagate(input);

            var expected = new List<IFuzzyNumber>
                {
                    new RealNumber(-20.0),
                    new RealNumber(-24.0),
                };

            int i = 0;
            foreach (var expectedNumber in expected)
            {
                Assert.That(output.ElementAt(i).GetMod().X, Is.EqualTo(expectedNumber.GetMod().X));
                i++;
            }
        }
Ejemplo n.º 2
0
        public void CorrectlySetWeightsVector()
        {
            const int inputs = 2;
            var hidden = new[] { 2, 2 };
            const int outputs = 2;
            var net = new SimpleFuzzyNet(inputs, hidden, ()=>new RealNumber(0.0), outputNeuronsCount: outputs);
            var weights = new Vector(new IFuzzyNumber[]
                {
                    //output layer
                    //first neuron
                    new RealNumber(2.0),
                    new RealNumber(2.0),
                    //second neuron
                    new RealNumber(4.0),
                    new RealNumber(2.0),

                    //hidden 1
                    new RealNumber(1.0),
                    new RealNumber(-1.5),
                    new RealNumber(2.0),
                    new RealNumber(1.0),

                    //hidden 2
                    new RealNumber(-1.0),
                    new RealNumber(-1.0),
                    new RealNumber(2.0),
                    new RealNumber(-1.0),
                });

            //tuple: (layer, neuron, weight)
            var expectedWeights = new Dictionary<Tuple<int, int, int>, IFuzzyNumber>();
            for (int i = 0; i < weights.Length; i++)
            {
                expectedWeights.Add(new Tuple<int, int, int>(ToLayerIndex(i), ToNeuronIndex(i), ToWeightIndex(i)),
                                    weights[i]);
            }

            net.SetWeights(weights);

            int l = 0;
            foreach (var layer in net.Layers)
            {
                layer.ForeachNeuron((i, neuron) =>
                {
                    neuron.ForeachWeight((j, weight) =>
                        {
                            Assert.That(weight.Signal.GetMod().X,
                                        Is.EqualTo(expectedWeights[new Tuple<int, int, int>(l, i, j)].GetMod().X));
                        });
                });
                l++;
            }
        }