예제 #1
0
 def setUp(self):
     mat1 = [[1,0,0],[0,1,1]]
     mat2 = [[1,0,1],[0,1,0]]
     mat3 = [[0,1,1],[1,0,0]]
     self.matrices = [mat1, mat2, mat3]
     cards = FlashCards(1, mat1, mat2, mat3)
     htm = HTM()
     htm.initialize_input(mat1)
     htm.execute(dataGenerator=cards.dataGenerator(), ticks=3*10, learning=True)
     
     self.htm = htm
예제 #2
0
파일: cell.py 프로젝트: Teddybot/pyHTM
    def testCreateSegment(self):
        h = HTM()
        h.initialize_input([[1, 1, 1], [1, 1, 1]])
        cell = Cell()
        startingSegments = config.getint("init", "segments_per_cell")
        self.assertEqual(startingSegments, len(cell.segments))
        cell.create_segment(h)
        self.assertEqual(startingSegments + 1, len(cell.segments))

        # make sure newly created segment has the right number of synapses
        self.assertNotEqual(0, len(cell.segments[-1].synapses))
예제 #3
0
 def setUp(self):
     mat1 = [[1,0,0],[0,1,1]]
     mat2 = [[1,0,1],[0,1,0]]
     mat3 = [[0,1,1],[1,0,0]]
     self.matrices = [mat1, mat2, mat3]
     cards = FlashCards(1, mat1, mat2, mat3)
     htm = HTM()
     htm.initialize_input(mat1)
     htm.execute(mat1, dataModifyFunc=cards.updateMatrix, ticks=3*10, learning=True)
     
     self.htm = htm
예제 #4
0
    def testFullFieldStaticImage(self):
        print_htm_state = False
        
        h = HTM(cellsPerColumn=1)
        h.initialize_input(self.sea_anemone)
        
        #learn the different static data images
        swap = FlashCards(90, self.sea_anemone, self.seastar, self.sea_cucumber, self.hermitcrab)
        h.execute(self.sea_anemone, swap.updateMatrix, ticks=90*4*3)
        
        #run the htm network through and save the state in a history object
        swap = FlashCards(10, self.sea_anemone, self.seastar, self.sea_cucumber, self.hermitcrab)
        history = ExciteHistory(temporal=False)
        h.execute(self.sea_anemone, swap.updateMatrix, ticks=10*4, learning=False, postTick=history.update)
        
        #label the different static data images
        recognize = ObjectRecognize()
        recognize.label('sea_anemone', history.data[-31])
        recognize.label('seastar', history.data[-21])
        recognize.label('sea_cucumber', history.data[-11])
        recognize.label('hermitcrab', history.data[-1])
        
        if print_htm_state:
            print "\n\n*************** Recognition Labeling **************\n\n"
            print history.text_graph()


        #test recognition of the different static data images
        swap.reset()
        history = ExciteHistory(temporal=False)
        h.execute(self.sea_anemone, swap.updateMatrix, ticks=10*4, learning=False, postTick=history.update)

        if print_htm_state:
            print "\n\n*************** Recognition Testing **************\n\n"
            print history.text_graph()
        
        
        #show and test recognition data
        testnames = ['sea_anemone', 'seastar', 'sea_cucumber', 'hermitcrab']
        testdata = history.data[9:40:10]
        
        print recognize.getMatchText(testnames, testdata)
        
        for x, labelrow in enumerate(recognize.getMatchData(testnames, testdata)):
            for y, match_percent in enumerate(labelrow):
                if x == y:
                    self.assertGreaterEqual(match_percent, 0.9, 
                        msg='htm did not correctly recognize the %s (%.1f%% match)' % (
                            testnames[x], match_percent*100))
                else:
                    self.assertLessEqual(match_percent, 0.8,
                        msg='htm thought it recognized a %s, when it saw a %s (%.1f%% match)' %(
                            testnames[x], testnames[y], match_percent*100))
예제 #5
0
    def setUp(self):
        mat1 = [[1, 0, 0], [0, 1, 1]]
        mat2 = [[1, 0, 1], [0, 1, 0]]
        mat3 = [[0, 1, 1], [1, 0, 0]]
        self.matrices = [mat1, mat2, mat3]
        cards = FlashCards(1, mat1, mat2, mat3)
        htm = HTM()
        htm.initialize_input(mat1)
        htm.execute(dataGenerator=cards.dataGenerator(),
                    ticks=3 * 10,
                    learning=True)

        self.htm = htm
예제 #6
0
파일: htm.py 프로젝트: arashgithub/pyHTM
class TestHTM(unittest.TestCase):


    def setUp(self):
        self.htm = HTM()
        self.data = [[1,0,1],[0,0,1]] #2d format, same dimensions as htm (for now)
        pass


    def tearDown(self):
        pass

    def _initialize(self):
        self.htm.initialize_input(self.data)

    def testInit(self):
        htm = self.htm
        
        self._initialize()
        self.assertEqual(htm.width, 2)
        self.assertEqual(htm.length, 3)
        cols = 0
        for col in htm.columns:
            cols += 1
            self.assertEqual(len(col.synapses), config.getint('init', 'synapses_per_segment'))
            
        self.assertEqual(cols, 6)
        
    def testKthNeighbor(self):
        'kth_neighbor in small networks'
        htm = self.htm
        self._initialize()
        
        sameNeighbor = None
        for col in htm.columns:
            neighbor = col.kth_neighbor(7) #ask for a lower neighbor than exists
            if sameNeighbor is not None:
                self.assertEqual(sameNeighbor, neighbor)
            else:
                sameNeighbor = neighbor
                
    def testReceptiveField(self):
        self._initialize()
        self.htm.average_receptive_field_size()
        
    def testDataLoop(self):
        htm = self.htm
        data = [[1,0,1],[0,0,1]] #2d format, same dimensions as htm (for now)
    
        htm.initialize_input(data)
                    
        htm.execute(flipDataGenerator(htm), ticks=20)

        #show output (this is way too verbose to leave in for long, 
        #    but useful during early testing)
#        for cell in htm.cells:
#            print cell
#        for col in htm.columns:
#            print col

    def testStability(self):
        'test that repeated patterns get recognized by the same columns after stabilizing'
        htm = self.htm
        
        #2d format, same dimensions as htm (for now)
        data = [[1,0,1,0,1,0,1,0,1,0],[0,0,0,0,1,0,0,0,0,1]]
        
        htm.initialize_input(data)
                    
        flipDat = flipDataGenerator(htm)
        htm.execute(flipDat, ticks=50)
        active = htm.columns_active()
        htm.execute(flipDat, ticks=1)
        self.assertEqual(active, htm.columns_active())
        htm.execute(flipDat, ticks=1)
        self.assertEqual(active, htm.columns_active())
        
        #show that stability is non-trivial because it changes at the next time step
        htm.execute(flipDat, ticks=0)
        self.assertNotEqual(active, htm.columns_active())

    def testPatternTraining(self):
        'test that within columns, particular cells dominate when they recognize learned temporal patterns'
        htm = self.htm
        
        #2d format, same dimensions as htm (for now)
        data = [
            [1,0,1,0,1,0,1,0,1,0],
            [0,0,0,0,1,0,1,0,1,1],
            [0,0,1,0,1,0,0,0,0,1],
            [0,1,0,0,1,1,0,1,0,1],
            [1,0,1,0,1,0,1,0,0,1],
            [0,0,0,1,1,0,0,0,1,1],
            ]
        
        htm.initialize_input(data)
                    
        flipDat = flipDataGenerator(htm)
        htm.execute(flipDat, ticks=100)
        
        activeCols = htm.columns_active()
        
        #all columns should have learned particular cell patterns by now
        for col in activeCols:
            self.assertNotEqual(len(col.cells), len(filter(lambda cell: cell.active, col.cells)))
            
    def testImagination(self):
        input1 = Mock()
        input1.stimulation=0
        input2 = Mock()
        input2.stimulation=0
        synapse1 = Mock()
        synapse1.input = input1
        synapse2 = Mock()
        synapse2.input = input2
        col1 = Mock()
        col1.synapsesConnected = [synapse1, synapse2]
        col2 = Mock()
        col2.synapsesConnected = [synapse2]
        columns = [col1,col2]
        inputCells = [[input1, input2]]
        
        self.htm._imagineStimulate(columns)
        
        input1.mockCheckCall(0, 'stimulate', 0.5)
        input2.mockCheckCall(0, 'stimulate', 0.5)
        input2.mockCheckCall(1, 'stimulate', 1)
        
        input1.stimulation = 0.5
        input2.stimulation = 1.5
        
        self.htm._imagineOverride(inputCells)
        input1.mockCheckCall(1, 'override')
        input2.mockCheckCall(2, 'override')
예제 #7
0
    def testFullFieldStaticImage(self):
        print_htm_state = False

        h = HTM(cellsPerColumn=1)
        h.initialize_input(self.sea_anemone, compressionFactor=3.5)

        #learn the different static data images
        swap = FlashCards(90, self.sea_anemone, self.seastar,
                          self.sea_cucumber, self.hermitcrab)
        h.execute(swap.dataGenerator(), ticks=90 * 4 * 3 - 1)

        #run the htm network through and save the state in a history object
        swap = FlashCards(10, self.sea_anemone, self.seastar,
                          self.sea_cucumber, self.hermitcrab)
        history = ExciteHistory(temporal=False)
        h.execute(swap.dataGenerator(),
                  ticks=10 * 4 - 1,
                  learning=False,
                  postTick=history.update)

        #label the different static data images
        recognize = ObjectRecognize()
        recognize.label('sea_anemone', history.data[-31])
        recognize.label('seastar', history.data[-21])
        recognize.label('sea_cucumber', history.data[-11])
        recognize.label('hermitcrab', history.data[-1])

        if print_htm_state:
            print "\n\n*************** Recognition Labeling **************\n\n"
            print history.text_graph()

        #test recognition of the different static data images
        swap.reset()
        history = ExciteHistory(temporal=False)
        h.execute(swap.dataGenerator(),
                  ticks=10 * 4 - 1,
                  learning=False,
                  postTick=history.update)

        if print_htm_state:
            print "\n\n*************** Recognition Testing **************\n\n"
            print history.text_graph()

        #show and test recognition data
        testnames = ['sea_anemone', 'seastar', 'sea_cucumber', 'hermitcrab']
        testdata = history.data[9:40:10]

        print recognize.getMatchText(testnames, testdata)

        for x, labelrow in enumerate(
                recognize.getMatchData(testnames, testdata)):
            for y, match_percent in enumerate(labelrow):
                if x == y:
                    self.assertGreaterEqual(
                        match_percent,
                        0.9,
                        msg=
                        'htm did not correctly recognize the %s (%.1f%% match)'
                        % (testnames[x], match_percent * 100))
                else:
                    self.assertLessEqual(
                        match_percent,
                        0.8,
                        msg=
                        'htm thought it recognized a %s, when it saw a %s (%.1f%% match)'
                        % (testnames[x], testnames[y], match_percent * 100))
예제 #8
0
파일: htm_main.py 프로젝트: Teddybot/pyHTM
from carver.htm import HTM

if __name__ == '__main__':
    htm = HTM()
    
    #prepare the initial data image in 2d format, same dimensions as htm, for now
    data = [
        [1,0,1,0,1,0,1,0,1,0],
        [0,0,0,0,1,0,1,0,1,1],
        [0,0,1,0,1,0,0,0,0,1],
        [0,1,0,0,1,1,0,1,0,1],
        [1,0,1,0,1,0,1,0,0,1],
        [0,0,0,1,1,0,0,0,1,1],
        ]
    
    htm.initialize_input(data)
    
    #this method should update the data matrix in place
    def dataUpdate(data):
        'flip all bits in data matrix'
        for x in xrange(len(data)):
            data[x]=map(lambda bit: not bit, data[x])
    
    htm.execute(data, dataUpdate, ticks=30)
    
    #TODO show output more effectively
    for cell in htm.cells:
        print cell
    for col in htm.columns:
        print col
    
예제 #9
0

if __name__ == '__main__':
    htm = HTM()

    #prepare the initial data image in 2d format, same dimensions as htm, for now
    data = [
        [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
        [0, 0, 0, 0, 1, 0, 1, 0, 1, 1],
        [0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
        [0, 1, 0, 0, 1, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 0, 0, 1],
        [0, 0, 0, 1, 1, 0, 0, 0, 1, 1],
    ]

    htm.initialize_input(data)

    #track htm's data history with
    history = ExciteHistory()

    htm.execute(flipDataGenerator(htm), ticks=180, postTick=history.update)

    print """*************** Graph History **************
Y-Axis: All cells in the network, with the 4 cells per column grouped together
X-Axis: Time
Colors:
\tblack: no activity
\tgray: predicting
\twhite: active
    
Notice that the network settles down very quickly at the left, but not completely.  You will typically see artifacts around 100 steps in (about halfway across the image).
예제 #10
0
파일: htm.py 프로젝트: Teddybot/pyHTM
class TestHTM(unittest.TestCase):


    def setUp(self):
        self.htm = HTM()
        self.data = [[1,0,1],[0,0,1]] #2d format, same dimensions as htm (for now)
        pass


    def tearDown(self):
        pass

    def _initialize(self):
        self.htm.initialize_input(self.data)

    def testInit(self):
        htm = self.htm
        
        self._initialize()
        self.assertEqual(htm.width, 2)
        self.assertEqual(htm.length, 3)
        cols = 0
        for col in htm.columns:
            cols += 1
            self.assertEqual(len(col.synapses), config.getint('init', 'synapses_per_segment'))
            
        self.assertEqual(cols, 6)
        
    def testKthNeighbor(self):
        'kth_neighbor in small networks'
        htm = self.htm
        self._initialize()
        
        sameNeighbor = None
        for col in htm.columns:
            neighbor = col.kth_neighbor(7) #ask for a lower neighbor than exists
            if sameNeighbor is not None:
                self.assertEqual(sameNeighbor, neighbor)
            else:
                sameNeighbor = neighbor
                
    def testReceptiveField(self):
        self._initialize()
        self.htm.average_receptive_field_size()
        
    def flipDataGenerator(self, htm):
        def flipData(data):
            #flip all data
            for x in xrange(htm.width):
                for y in xrange(htm.length):
                    data[x][y] = not data[x][y]
        return flipData
        
    def testDataLoop(self):
        htm = self.htm
        data = [[1,0,1],[0,0,1]] #2d format, same dimensions as htm (for now)
    
        htm.initialize_input(data)
                    
        htm.execute(data, self.flipDataGenerator(htm), ticks=20)

        #show output (this is way too verbose to leave in for long, 
        #    but useful during early testing)
#        for cell in htm.cells:
#            print cell
#        for col in htm.columns:
#            print col

    def testStability(self):
        'test that repeated patterns get recognized by the same columns after stabilizing'
        htm = self.htm
        
        #2d format, same dimensions as htm (for now)
        data = [[1,0,1,0,1,0,1,0,1,0],[0,0,0,0,1,0,0,0,0,1]]
        
        htm.initialize_input(data)
                    
        flipDat = self.flipDataGenerator(htm)
        htm.execute(data, flipDat, ticks=50)
        active = htm.columns_active()
        htm.execute(data, flipDat, ticks=2)
        self.assertEqual(active, htm.columns_active())
        htm.execute(data, flipDat, ticks=2)
        self.assertEqual(active, htm.columns_active())
        
        #show that stability is non-trivial because it changes at the next time step
        htm.execute(data, flipDat)
        self.assertNotEqual(active, htm.columns_active())

    def testPatternTraining(self):
        'test that within columns, particular cells dominate when they recognize learned temporal patterns'
        htm = self.htm
        
        #2d format, same dimensions as htm (for now)
        data = [
            [1,0,1,0,1,0,1,0,1,0],
            [0,0,0,0,1,0,1,0,1,1],
            [0,0,1,0,1,0,0,0,0,1],
            [0,1,0,0,1,1,0,1,0,1],
            [1,0,1,0,1,0,1,0,0,1],
            [0,0,0,1,1,0,0,0,1,1],
            ]
        
        htm.initialize_input(data)
                    
        flipDat = self.flipDataGenerator(htm)
        htm.execute(data, flipDat, ticks=100)
        
        htm.execute(data, flipDat, ticks=1)
        
        activeCols = htm.columns_active()
        
        #all columns should have learned particular cell patterns by now
        for col in activeCols:
            self.assertNotEqual(len(col.cells), len(filter(lambda cell: cell.active, col.cells)))
예제 #11
0
파일: htm.py 프로젝트: Sandy4321/pyHTM-1
class TestHTM(unittest.TestCase):
    def setUp(self):
        self.htm = HTM()
        self.data = [[1, 0, 1],
                     [0, 0, 1]]  #2d format, same dimensions as htm (for now)
        pass

    def tearDown(self):
        pass

    def _initialize(self):
        self.htm.initialize_input(self.data)

    def testInit(self):
        htm = self.htm

        self._initialize()
        self.assertEqual(htm.width, 2)
        self.assertEqual(htm.length, 3)
        cols = 0
        for col in htm.columns:
            cols += 1
            self.assertEqual(len(col.synapses),
                             config.getint('init', 'synapses_per_segment'))

        self.assertEqual(cols, 6)

    def testKthNeighbor(self):
        'kth_neighbor in small networks'
        htm = self.htm
        self._initialize()

        sameNeighbor = None
        for col in htm.columns:
            neighbor = col.kth_neighbor(
                7)  #ask for a lower neighbor than exists
            if sameNeighbor is not None:
                self.assertEqual(sameNeighbor, neighbor)
            else:
                sameNeighbor = neighbor

    def testReceptiveField(self):
        self._initialize()
        self.htm.average_receptive_field_size()

    def testDataLoop(self):
        htm = self.htm
        data = [[1, 0, 1], [0, 0,
                            1]]  #2d format, same dimensions as htm (for now)

        htm.initialize_input(data)

        htm.execute(flipDataGenerator(htm), ticks=20)

        #show output (this is way too verbose to leave in for long,
        #    but useful during early testing)


#        for cell in htm.cells:
#            print cell
#        for col in htm.columns:
#            print col

    def testStability(self):
        'test that repeated patterns get recognized by the same columns after stabilizing'
        htm = self.htm

        #2d format, same dimensions as htm (for now)
        data = [[1, 0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 1]]

        htm.initialize_input(data)

        flipDat = flipDataGenerator(htm)
        htm.execute(flipDat, ticks=50)
        active = htm.columns_active()
        htm.execute(flipDat, ticks=1)
        self.assertEqual(active, htm.columns_active())
        htm.execute(flipDat, ticks=1)
        self.assertEqual(active, htm.columns_active())

        #show that stability is non-trivial because it changes at the next time step
        htm.execute(flipDat, ticks=0)
        self.assertNotEqual(active, htm.columns_active())

    def testPatternTraining(self):
        'test that within columns, particular cells dominate when they recognize learned temporal patterns'
        htm = self.htm

        #2d format, same dimensions as htm (for now)
        data = [
            [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],
            [0, 0, 0, 0, 1, 0, 1, 0, 1, 1],
            [0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
            [0, 1, 0, 0, 1, 1, 0, 1, 0, 1],
            [1, 0, 1, 0, 1, 0, 1, 0, 0, 1],
            [0, 0, 0, 1, 1, 0, 0, 0, 1, 1],
        ]

        htm.initialize_input(data)

        flipDat = flipDataGenerator(htm)
        htm.execute(flipDat, ticks=100)

        activeCols = htm.columns_active()

        #all columns should have learned particular cell patterns by now
        for col in activeCols:
            self.assertNotEqual(
                len(col.cells), len(filter(lambda cell: cell.active,
                                           col.cells)))

    def testImagination(self):
        input1 = Mock()
        input1.stimulation = 0
        input2 = Mock()
        input2.stimulation = 0
        synapse1 = Mock()
        synapse1.input = input1
        synapse2 = Mock()
        synapse2.input = input2
        col1 = Mock()
        col1.synapsesConnected = [synapse1, synapse2]
        col2 = Mock()
        col2.synapsesConnected = [synapse2]
        columns = [col1, col2]
        inputCells = [[input1, input2]]

        self.htm._imagineStimulate(columns)

        input1.mockCheckCall(0, 'stimulate', 0.5)
        input2.mockCheckCall(0, 'stimulate', 0.5)
        input2.mockCheckCall(1, 'stimulate', 1)

        input1.stimulation = 0.5
        input2.stimulation = 1.5

        self.htm._imagineOverride(inputCells)
        input1.mockCheckCall(1, 'override')
        input2.mockCheckCall(2, 'override')