Exemplo n.º 1
0
        public void TestRegion_ABBCBB()
        {
            int regionIterationsToLearnExpected = 28;
            int repeatSequencesToRun = 20;

            this.DefaultSynapseValues();
            var imageFiles = new string[]
            {
                "../CLA.Tests/images/ABBCBBA/image-A.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp",
                "../CLA.Tests/images/ABBCBBA/image-C.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp"
                //"../CLA.Tests/images/ABBCBBA/image-A.bmp",
            };

            string outDir = "../CLA.Tests/images/ABBCBBA/";
            var data = new int[imageFiles.Length][,];

            for (int i = 0; i < imageFiles.Length; ++i)
            {
                data[i] = this.GetNextPictureFromFile(imageFiles[i]);
            }

            int[,] sample = this.GetNextPictureFromFile(imageFiles[0]);
            var inputSize = new Size(sample.GetLength(0), sample.GetLength(1));
            int localityRadius = 0;
            int cellsPerCol = 4;
            int segmentActiveThreshold = 4;
            int newSynapses = 5;

            var region = new Region(0, null, inputSize, 1.0f, 1.0f, 1, localityRadius, cellsPerCol,
                                    segmentActiveThreshold, newSynapses);
            Global.TemporalLearning = true;

            int iters = 0;
            for (int iter = 0; iter < repeatSequencesToRun; ++iter)
            {
                for (int img = 0; img < imageFiles.Length; ++img)
                {
                    iters++;
                    region.SetInput(data[img]);
                    region.NextTimeStep();

                    // Examine region accuracy
                    float columnActivationAccuracy = region.Statistics.ColumnActivationAccuracy;
                    float columnPredictionAccuracy = region.Statistics.ColumnPredictionAccuracy;
            #if (DEBUG)
                    Console.Write("\niter=" + iter + " img=" + img + "  accuracy: " + columnActivationAccuracy + "  " + columnPredictionAccuracy);
                    Console.Write(" nc: " + region.Statistics.NumberActiveColumns);
            #endif

                    int[,] outData = region.GetPredictingColumnsByTimeStep();
                    int n1 = 0, n2 = 0, n3 = 0;

                    foreach (var outVal in outData)
                    {
                        n1 += outVal == 1 ? 1 : 0;
                        n2 += outVal == 2 ? 1 : 0;
                        n3 += outVal == 3 ? 1 : 0;
                    }

            #if (DEBUG)
                    Console.Write(" np:" + n1 + " " + n2 + " " + n3);
            #endif

                    this.WritePredictionsToFile(outData, outDir + "prediction-pass-" + iter + "-image-" + (img + 1) + ".bmp");

                    if (iter > regionIterationsToLearnExpected)
                    {
                        // we expect 100% accuracy
                        Assert.Equal(1.0f, region.Statistics.ColumnActivationAccuracy, 5);
                        Assert.Equal(1.0f, region.Statistics.ColumnPredictionAccuracy, 5);
                    }
                    else
                    {
                        //before that we expect 0% accuracy
                        //Assert.Equal(0.0f, region.ColumnActivationAccuracy, 5);
                        //Assert.Equal(0.0f, region.ColumnPredictionAccuracy, 5);
                    }
                }
            }
        }
Exemplo n.º 2
0
        public void TestRegion_ABBCBB()
        {
            int regionIterationsToLearnExpected = 28;
            int repeatSequencesToRun            = 20;

            this.DefaultSynapseValues();
            var imageFiles = new string[]
            {
                "../CLA.Tests/images/ABBCBBA/image-A.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp",
                "../CLA.Tests/images/ABBCBBA/image-C.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp",
                "../CLA.Tests/images/ABBCBBA/image-B.bmp"
                //"../CLA.Tests/images/ABBCBBA/image-A.bmp",
            };

            string outDir = "../CLA.Tests/images/ABBCBBA/";
            var    data   = new int[imageFiles.Length][, ];

            for (int i = 0; i < imageFiles.Length; ++i)
            {
                data[i] = this.GetNextPictureFromFile(imageFiles[i]);
            }

            int[,] sample = this.GetNextPictureFromFile(imageFiles[0]);
            var inputSize              = new Size(sample.GetLength(0), sample.GetLength(1));
            int localityRadius         = 0;
            int cellsPerCol            = 4;
            int segmentActiveThreshold = 4;
            int newSynapses            = 5;

            var region = new Region(0, null, inputSize, 1.0f, 1.0f, 1, localityRadius, cellsPerCol,
                                    segmentActiveThreshold, newSynapses);

            Global.TemporalLearning = true;

            int iters = 0;

            for (int iter = 0; iter < repeatSequencesToRun; ++iter)
            {
                for (int img = 0; img < imageFiles.Length; ++img)
                {
                    iters++;
                    region.SetInput(data[img]);
                    region.NextTimeStep();

                    // Examine region accuracy
                    float columnActivationAccuracy = region.Statistics.ColumnActivationAccuracy;
                    float columnPredictionAccuracy = region.Statistics.ColumnPredictionAccuracy;
#if (DEBUG)
                    Console.Write("\niter=" + iter + " img=" + img + "  accuracy: " + columnActivationAccuracy + "  " + columnPredictionAccuracy);
                    Console.Write(" nc: " + region.Statistics.NumberActiveColumns);
#endif

                    int[,] outData = region.GetPredictingColumnsByTimeStep();
                    int n1 = 0, n2 = 0, n3 = 0;

                    foreach (var outVal in outData)
                    {
                        n1 += outVal == 1 ? 1 : 0;
                        n2 += outVal == 2 ? 1 : 0;
                        n3 += outVal == 3 ? 1 : 0;
                    }

#if (DEBUG)
                    Console.Write(" np:" + n1 + " " + n2 + " " + n3);
#endif

                    this.WritePredictionsToFile(outData, outDir + "prediction-pass-" + iter + "-image-" + (img + 1) + ".bmp");

                    if (iter > regionIterationsToLearnExpected)
                    {
                        // we expect 100% accuracy
                        Assert.Equal(1.0f, region.Statistics.ColumnActivationAccuracy, 5);
                        Assert.Equal(1.0f, region.Statistics.ColumnPredictionAccuracy, 5);
                    }
                    else
                    {
                        //before that we expect 0% accuracy
                        //Assert.Equal(0.0f, region.ColumnActivationAccuracy, 5);
                        //Assert.Equal(0.0f, region.ColumnPredictionAccuracy, 5);
                    }
                }
            }
        }
Exemplo n.º 3
0
        public void testRegion_BasicSpatialTemporalPooling()
        {
            this.DefaultSynapseValues();

            var inputSize = new Size(128, 128); //input data is size 128x128
            var regionSize = new Size(32, 32); //region's column grid is size 32x32

            float pctInputPerCol = 0.01f; //each column connects to 1% random input bits
            float pctMinOverlap = 0.07f; //7% of column bits at minimum to be active
            int localityRadius = 0; //columns can connect anywhere within input
            float pctLocalActivity = 0.5f; //half of columns within radius inhibited
            int cellsPerCol = 4;
            int segActiveThreshold = 10;
            int newSynapseCount = 10;

            var region = new Region(0, null, regionSize, pctInputPerCol, pctMinOverlap,
                                    localityRadius, pctLocalActivity, cellsPerCol, segActiveThreshold,
                                    newSynapseCount, true);
            Global.SpatialLearning = false;
            Global.TemporalLearning = true;

            int dataSize = inputSize.Width * inputSize.Height;
            var data = new int[inputSize.Width,inputSize.Height];
            region.SetInput(data);

            int iters = 0;
            int accCount = 0;
            double accSum = 0.0;

            for (int k = 0; k < 10; ++k)
            {
                for (int i = 0; i < 10; ++i)
                {
                    iters++;
                    //data will contain a 128x128 bit representation
                    for (int di = 0; di < inputSize.Width; ++di) //reset all data to 0
                    {
                        for (int dj = 0; dj < inputSize.Height; ++dj)
                        {
                            data[di, dj] = 0;
                        }
                    }

                    for (int j = 0; j < dataSize / 10; ++j) //assign next 10% set to 1's
                    {
                        int index = (i * (dataSize / 10)) + j;
                        int di = index == 0 ? 0 : index % inputSize.Width;
                        int dj = index == 0 ? 0 : index / inputSize.Width;
                        data[di, dj] = 1;
                    }

                    region.NextTimeStep();

                    // Expect 15-25 active columns per time step
                    Assert.InRange(region.Statistics.NumberActiveColumns, 15, 25);

                    float columnActivationAccuracy = region.Statistics.ColumnActivationAccuracy;
                    float columnPredictionAccuracy = region.Statistics.ColumnPredictionAccuracy;
            #if (DEBUG)
                    Console.Write("\niter" + iters + "  Acc: " + columnActivationAccuracy + "  " + columnPredictionAccuracy);
                    Console.Write(" nc:" + region.Statistics.NumberActiveColumns);
            #endif

                    //find the max sequence segment count across the Region; should be 1
                    int maxSeg = 0;
                    float meanSeg = 0.0f;
                    float totalSeg = 0;
                    foreach (var col in region.Columns)
                    {
                        foreach (var cell in col.Cells)
                        {
                            int nseg = 0;
                            foreach (var seg in cell.DistalSegments)
                            {
                                if (seg.NumberPredictionSteps == 1)
                                {
                                    nseg++;
                                }
                            }
                            if (nseg > maxSeg)
                            {
                                maxSeg = nseg;
                            }
                            meanSeg += nseg;
                            totalSeg += 1;
                        }
                    }
                    meanSeg /= totalSeg;
            #if (DEBUG)
                    Console.Write("  maxSeg: " + maxSeg);
            #endif
                    if (iters > 1)
                    {
                        Assert.Equal(maxSeg, 1);
                    }

                    if (k > 0 && i > 0)
                    {
                        Console.Write(" ");
                    }

                    // Get the current column predictions.  outData is size 32x32 to match the
                    // column grid.  each value represents whether the column is predicted to
                    // happen soon.  a value of 1 indicates the column is predicted to be active
                    // in t+1, value of 2 for t+2, etc.  value of 0 indicates column is not
                    // being predicted any time soon.
                    int[,] outData = region.GetPredictingColumnsByTimeStep();
                    int n1 = 0, n2 = 0, n3 = 0;
                    foreach (var outVal in outData)
                    {
                        n1 += outVal == 1 ? 1 : 0;
                        n2 += outVal == 2 ? 1 : 0;
                        n3 += outVal == 3 ? 1 : 0;
                    }
            #if (DEBUG)
                    Console.Write(" np:" + n1 + " " + n2 + " " + n3);
            #endif

                    if (k > 1 || (k == 1 && i >= 1))
                    {
                        //after 1 full sequence presented, we expect 100% prediction accuracy.
                        //Activation accuracy may be slightly less than 100% if some columns share
                        //activation states amongst different inputs (can happen based on random
                        //initial connections in the spatial pooler).
                        Assert.InRange(region.Statistics.ColumnActivationAccuracy, 0.9f, 1.0f);
                        Assert.Equal(1.0f, region.Statistics.ColumnPredictionAccuracy, 5);

                        accCount += 1;
                        accSum += region.Statistics.ColumnActivationAccuracy;

                        //we also expect predicting columns to match previous active columns
                        //each successive time step we expect farther-out predictions
                        Assert.InRange(n1, 15, 25);
                        if (k > 1)
                        {
                            Assert.InRange(n2, 15, 25);
                            if (k > 2)
                            {
                                Assert.InRange(n3, 15, 25);
                            }
                        }
                    }
                    else
                    {
                        //before that we expect 0% accuracy and 0 predicting columns
                        Assert.Equal(0.0f, region.Statistics.ColumnActivationAccuracy, 5);
                        Assert.Equal(0.0f, region.Statistics.ColumnPredictionAccuracy, 5);
                        if (k == 0)
                        {
                            Assert.Equal(0, n1);
                            Assert.Equal(0, n2);
                            Assert.Equal(0, n3);
                        }
                    }
                }
            #if (DEBUG)
                Console.Write("\n");
            #endif
            }

            double meanAccuracy = accSum / accCount;
            #if (DEBUG)
            Console.WriteLine("total iters = " + iters);
            Console.WriteLine("meanAcc: " + meanAccuracy);
            #endif
            Assert.InRange(meanAccuracy, 0.99, 1.0); //at least 99% average activation accuracy
        }
Exemplo n.º 4
0
        public void testRegion_BasicSpatialTemporalPooling()
        {
            this.DefaultSynapseValues();

            var inputSize  = new Size(128, 128); //input data is size 128x128
            var regionSize = new Size(32, 32);   //region's column grid is size 32x32

            float pctInputPerCol     = 0.01f;    //each column connects to 1% random input bits
            float pctMinOverlap      = 0.07f;    //7% of column bits at minimum to be active
            int   localityRadius     = 0;        //columns can connect anywhere within input
            float pctLocalActivity   = 0.5f;     //half of columns within radius inhibited
            int   cellsPerCol        = 4;
            int   segActiveThreshold = 10;
            int   newSynapseCount    = 10;

            var region = new Region(0, null, regionSize, pctInputPerCol, pctMinOverlap,
                                    localityRadius, pctLocalActivity, cellsPerCol, segActiveThreshold,
                                    newSynapseCount, true);

            Global.SpatialLearning  = false;
            Global.TemporalLearning = true;

            int dataSize = inputSize.Width * inputSize.Height;
            var data     = new int[inputSize.Width, inputSize.Height];

            region.SetInput(data);

            int    iters    = 0;
            int    accCount = 0;
            double accSum   = 0.0;

            for (int k = 0; k < 10; ++k)
            {
                for (int i = 0; i < 10; ++i)
                {
                    iters++;
                    //data will contain a 128x128 bit representation
                    for (int di = 0; di < inputSize.Width; ++di)                     //reset all data to 0
                    {
                        for (int dj = 0; dj < inputSize.Height; ++dj)
                        {
                            data[di, dj] = 0;
                        }
                    }

                    for (int j = 0; j < dataSize / 10; ++j)                     //assign next 10% set to 1's
                    {
                        int index = (i * (dataSize / 10)) + j;
                        int di    = index == 0 ? 0 : index % inputSize.Width;
                        int dj    = index == 0 ? 0 : index / inputSize.Width;
                        data[di, dj] = 1;
                    }

                    region.NextTimeStep();

                    // Expect 15-25 active columns per time step
                    Assert.InRange(region.Statistics.NumberActiveColumns, 15, 25);

                    float columnActivationAccuracy = region.Statistics.ColumnActivationAccuracy;
                    float columnPredictionAccuracy = region.Statistics.ColumnPredictionAccuracy;
#if (DEBUG)
                    Console.Write("\niter" + iters + "  Acc: " + columnActivationAccuracy + "  " + columnPredictionAccuracy);
                    Console.Write(" nc:" + region.Statistics.NumberActiveColumns);
#endif

                    //find the max sequence segment count across the Region; should be 1
                    int   maxSeg   = 0;
                    float meanSeg  = 0.0f;
                    float totalSeg = 0;
                    foreach (var col in region.Columns)
                    {
                        foreach (var cell in col.Cells)
                        {
                            int nseg = 0;
                            foreach (var seg in cell.DistalSegments)
                            {
                                if (seg.NumberPredictionSteps == 1)
                                {
                                    nseg++;
                                }
                            }
                            if (nseg > maxSeg)
                            {
                                maxSeg = nseg;
                            }
                            meanSeg  += nseg;
                            totalSeg += 1;
                        }
                    }
                    meanSeg /= totalSeg;
#if (DEBUG)
                    Console.Write("  maxSeg: " + maxSeg);
#endif
                    if (iters > 1)
                    {
                        Assert.Equal(maxSeg, 1);
                    }

                    if (k > 0 && i > 0)
                    {
                        Console.Write(" ");
                    }

                    // Get the current column predictions.  outData is size 32x32 to match the
                    // column grid.  each value represents whether the column is predicted to
                    // happen soon.  a value of 1 indicates the column is predicted to be active
                    // in t+1, value of 2 for t+2, etc.  value of 0 indicates column is not
                    // being predicted any time soon.
                    int[,] outData = region.GetPredictingColumnsByTimeStep();
                    int n1 = 0, n2 = 0, n3 = 0;
                    foreach (var outVal in outData)
                    {
                        n1 += outVal == 1 ? 1 : 0;
                        n2 += outVal == 2 ? 1 : 0;
                        n3 += outVal == 3 ? 1 : 0;
                    }
#if (DEBUG)
                    Console.Write(" np:" + n1 + " " + n2 + " " + n3);
#endif

                    if (k > 1 || (k == 1 && i >= 1))
                    {
                        //after 1 full sequence presented, we expect 100% prediction accuracy.
                        //Activation accuracy may be slightly less than 100% if some columns share
                        //activation states amongst different inputs (can happen based on random
                        //initial connections in the spatial pooler).
                        Assert.InRange(region.Statistics.ColumnActivationAccuracy, 0.9f, 1.0f);
                        Assert.Equal(1.0f, region.Statistics.ColumnPredictionAccuracy, 5);

                        accCount += 1;
                        accSum   += region.Statistics.ColumnActivationAccuracy;

                        //we also expect predicting columns to match previous active columns
                        //each successive time step we expect farther-out predictions
                        Assert.InRange(n1, 15, 25);
                        if (k > 1)
                        {
                            Assert.InRange(n2, 15, 25);
                            if (k > 2)
                            {
                                Assert.InRange(n3, 15, 25);
                            }
                        }
                    }
                    else
                    {
                        //before that we expect 0% accuracy and 0 predicting columns
                        Assert.Equal(0.0f, region.Statistics.ColumnActivationAccuracy, 5);
                        Assert.Equal(0.0f, region.Statistics.ColumnPredictionAccuracy, 5);
                        if (k == 0)
                        {
                            Assert.Equal(0, n1);
                            Assert.Equal(0, n2);
                            Assert.Equal(0, n3);
                        }
                    }
                }
#if (DEBUG)
                Console.Write("\n");
#endif
            }

            double meanAccuracy = accSum / accCount;
#if (DEBUG)
            Console.WriteLine("total iters = " + iters);
            Console.WriteLine("meanAcc: " + meanAccuracy);
#endif
            Assert.InRange(meanAccuracy, 0.99, 1.0);             //at least 99% average activation accuracy
        }