Implements the Bidirectional Associative Memory (BAM) network.
The Bidirectional Associative Memory (BAM) network that consists of two layers. An input layer and an output layer. The main difference between backpropagation architecture is that BAM does not stop learning when input values reach the output layer. The learning phase stops when the network becomes stable ; no change between input and output values during two consecutive cycles. The pattern sets for training and running and ouput results can only have two values : 1.1 or -1.1. The BAM is a relatively simple neural network architecture with a content addressable memory. BAM is usefull for pattern recognition or with noisy and corrupted patterns. Bam can also "forget" if there are two many patterns in it. BAM becomes saturated when the number of patterns stored is greater than the minimum of the input layer count and the ouput layer node count. BAM System is created to solve this problem.
Inheritance: xpidea.neuro.net.adaline.AdalineNetwork
Ejemplo n.º 1
0
        /// <summary>
        ///     Overridden.Loads the BAM system data from a binary stream.
        /// </summary>
        /// <param name="binaryReader">Binary stream reader.</param>
        public override void Load(BinaryReader binaryReader)
        {
            base.Load(binaryReader);
            Create(inputLayerNodesCount, outputLayerNodesCount);
            networksCount = binaryReader.ReadInt32();
            var networks = new BidirectionalAssociativeMemoryNetwork[networksCount];

            for (var i = 0; i < networksCount; i++)
            {
                networks[i] = new BidirectionalAssociativeMemoryNetwork(inputLayerNodesCount, outputLayerNodesCount);
                networks[i].Load(binaryReader);
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 ///     Overridden.Runs the system.
 /// </summary>
 public override void Run()
 {
     LoadInputs();
     bestError = double.PositiveInfinity;
     for (var i = 0; i < networksCount; i++)
     {
         networks[i].SetValuesFromPattern(data);
         networks[i].Run();
         var err = networks[i].Error;
         if (err <= bestError)
         {
             bestError = err;
             best      = networks[i];
         }
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        ///     Overridden.Teaches the system.
        /// </summary>
        public override void Learn()
        {
            var isLearned = false;

            for (var i = 0; i < networksCount; i++)
            {
                if (isLearned)
                {
                    break;
                }
                networks[i].SetValuesFromPattern(data);
                networks[i].Learn();
                if (networks[i].Error != 0)
                {
                    networks[i].UnLearn();
                }
                else
                {
                    isLearned = true;
                }
            }
            if (!isLearned)
            {
                var oldNetworks = networks;
                networks = new BidirectionalAssociativeMemoryNetwork[networksCount + 1];
                if (oldNetworks != null)
                {
                    oldNetworks.CopyTo(networks, 0);
                }
                networks[networksCount] = new BidirectionalAssociativeMemoryNetwork(inputLayerNodesCount,
                                                                                    outputLayerNodesCount);
                networks[networksCount].SetValuesFromPattern(data);
                networks[networksCount].Learn();
                networksCount++;
            }
        }
Ejemplo n.º 4
0
 /// <summary>
 ///     Overridden.Loads the BAM system data from a binary stream.
 /// </summary>
 /// <param name="binaryReader">Binary stream reader.</param>
 public override void Load(BinaryReader binaryReader)
 {
     base.Load(binaryReader);
     Create(inputLayerNodesCount, outputLayerNodesCount);
     networksCount = binaryReader.ReadInt32();
     var networks = new BidirectionalAssociativeMemoryNetwork[networksCount];
     for (var i = 0; i < networksCount; i++)
     {
         networks[i] = new BidirectionalAssociativeMemoryNetwork(inputLayerNodesCount, outputLayerNodesCount);
         networks[i].Load(binaryReader);
     }
 }
Ejemplo n.º 5
0
 /// <summary>
 ///     Overridden.Teaches the system.
 /// </summary>
 public override void Learn()
 {
     var isLearned = false;
     for (var i = 0; i < networksCount; i++)
     {
         if (isLearned) break;
         networks[i].SetValuesFromPattern(data);
         networks[i].Learn();
         if (networks[i].Error != 0)
             networks[i].UnLearn();
         else
             isLearned = true;
     }
     if (!isLearned)
     {
         var oldNetworks = networks;
         networks = new BidirectionalAssociativeMemoryNetwork[networksCount + 1];
         if (oldNetworks != null)
             oldNetworks.CopyTo(networks, 0);
         networks[networksCount] = new BidirectionalAssociativeMemoryNetwork(inputLayerNodesCount,
             outputLayerNodesCount);
         networks[networksCount].SetValuesFromPattern(data);
         networks[networksCount].Learn();
         networksCount++;
     }
 }
Ejemplo n.º 6
0
 /// <summary>
 ///     Overridden.Runs the system.
 /// </summary>
 public override void Run()
 {
     LoadInputs();
     bestError = double.PositiveInfinity;
     for (var i = 0; i < networksCount; i++)
     {
         networks[i].SetValuesFromPattern(data);
         networks[i].Run();
         var err = networks[i].Error;
         if (err <= bestError)
         {
             bestError = err;
             best = networks[i];
         }
     }
 }