def run(self,
            num_kernels  = [125,125],
            kernel_sizes = [(11, 11), (5, 5)],
            batch_size   = 50,
            epochs       = 100000,
            optimizer    = 'RMSprop'):
            
            
        optimizerData = {}
        optimizerData['learning_rate'] = 0.0005/2
        optimizerData['rho']           = 0.9
        optimizerData['epsilon']       = 1e-2
        optimizerData['momentum']      = 0.9
        
        print '... Loading data'
        
        # load in and process data
        if data_size == 'large':
            preProcess              = PreProcess()
            data                    = preProcess.run()
        elif data_size == 'medium':
            preProcess              = Medium()
            data                    = preProcess.run()
        elif data_size == 'small':
            preProcess             = Small()
            data                    = preProcess.run()   
        else:
            print 'data_size must be small, medium or large.'
            exit()
        train_set_x,train_set_y = data[0],data[3]
        valid_set_x,valid_set_y = data[1],data[4]
        test_set_x,test_set_y   = data[2],data[5]

        train_set_x = theano.tensor._shared(train_set_x,borrow=True)
        valid_set_x = theano.tensor._shared(valid_set_x,borrow=True)
        train_set_y = theano.tensor._shared(train_set_y,borrow=True)
        valid_set_y = theano.tensor._shared(valid_set_y,borrow=True)
        test_set_x  = theano.tensor._shared(test_set_x,borrow=True)
        test_set_y  = theano.tensor._shared(test_set_y,borrow=True)
        
        print '... Initializing network'
       
        # training parameters
        self.n_sports = 500
    
        # print error if batch size is to large
        if valid_set_y.get_value(borrow=True).size<batch_size:
            print 'Error: Batch size is larger than size of validation set.'

        # compute batch sizes for train/test/validation
        n_train_batches  = train_set_x.get_value(borrow=True).shape[0]
        n_valid_batches  = valid_set_x.get_value(borrow=True).shape[0]
        n_test_batches   = test_set_x.get_value(borrow=True).shape[0]
        n_train_batches /= batch_size
        n_valid_batches /= batch_size
        n_test_batches  /= batch_size

        # symbolic variables
        x = T.matrix('x')  # input image data
        y = T.ivector('y')  # input label data
        
        self.model(batch_size, num_kernels, kernel_sizes, x, y)

        # Initialize parameters and functions
        cost   = self.layer3.negative_log_likelihood(y)        # Cost function
        params = self.params                                   # List of parameters
        grads  = T.grad(cost, params)                          # Gradient
        index  = T.lscalar()                                   # Index
        
        # Intialize optimizer
        updates = self.init_optimizer(optimizer, cost, params, optimizerData)

        # Train function
        train_model = theano.function(
                        [index],
                        cost,
                        updates = updates,
                        givens  = {
                                        x: train_set_x[index * batch_size: (index + 1) * batch_size], 
                                        y: train_set_y[index * batch_size: (index + 1) * batch_size] 
                        }
                    )      
            

        # Validation function
        validate_model = theano.function(
                         [index],
                         self.layer3.errors(y),
                         givens = {
                                  x: valid_set_x[index * batch_size: (index + 1) * batch_size],
                                  y: valid_set_y[index * batch_size: (index + 1) * batch_size]
                }
            )

        # Test function
        test_model = theano.function(
             [index],
             self.layer3.errors(y),
             givens = {
                      x: test_set_x[index * batch_size: (index + 1) * batch_size],
                      y: test_set_y[index * batch_size: (index + 1) * batch_size]
            }
        )

        predict = theano.function(inputs = [index],
                            outputs = self.layer3.prediction(),
                            givens = {
                            x: test_set_x[index*batch_size: (index+1)*batch_size]
            }
        )

        

        def solve():
            costs = []
            for i in xrange(n_train_batches):
                costs.append(train_model(i))
            return costs

        def shuffle(train_set_x,train_set_y):
            #print train_set_x.get_value(borrow=True).shape[0]
            rand = np.random.permutation(range(train_set_x.get_value(borrow=True).shape[0]))
            train_set_x.set_value(train_set_x.get_value(borrow=True)[rand],borrow=True)
            train_set_y.set_value(train_set_y.get_value(borrow=True)[rand],borrow=True)
            return train_set_x,train_set_y,train_model


        print np.savetxt('y_vec_LARGE.txt',test_set_y.get_value(borrow=True),delimiter=',')
        length = test_set_y.get_value(borrow=True).shape[0]
        print length
        print 'saved'
        try:
            print '... Solving'
            start_time = time.time()    
            for epoch in range(epochs):
                t1 = time.time()
                train_set_x,train_set_y,train_model = shuffle(train_set_x,train_set_y) 
                costs                   = solve()
                validation_losses       = [validate_model(i) for i in xrange(n_valid_batches)]
                t2 = time.time()
                print "Epoch {}    NLL {:.2}    %err in validation set {:.1%}    Time (epoch/total) {:.2}/{:.2} mins".format(epoch + 1, np.mean(costs), np.mean(validation_losses),(t2-t1)/60.,(t2-start_time)/60.)
                # f = open('workfile' , 'r+')
                # f.write("Epoch {}    NLL {:.2}    %err in validation set {:.1%}    Time (epoch/total) {:.2}/{:.2} mins".format(epoch + 1, np.mean(costs), np.mean(validation_losses),(t2-t1)/60.,(t2-start_time)/60.))
                # f.close()
                with open("workfile_BIG31", "a") as myfile:
                     myfile.write("Epoch {}    NLL {:.2}    %err in validation set {:.1%}    Time (epoch/total) {:.2}/{:.2} mins \n".format(epoch + 1, np.mean(costs), np.mean(validation_losses),(t2-t1)/60.,(t2-start_time)/60.))
                if epoch%1== 0:
                    predictions = np.array([predict(i) for i in range(n_test_batches)])
                    print predictions[0].shape
                    print predictions.shape
                    predictions = predictions.reshape((length-length%batch_size),500) 
                    with file('workfile_BIG33', 'w') as outfile:
                        # I'm writing a header here just for the sake of readability
                        # Any line starting with "#" will be ignored by numpy.loadtxt
                        outfile.write('# Array shape: {0}\n'.format(len(predictions)))

                        # Iterating through a ndimensional array produces slices along
                        # the last axis. This is equivalent to data[i,:,:] in this case
                        for data_slice in predictions:

                            # The formatting string indicates that I'm writing out
                            # the values in left-justified columns 7 characters in width
                            # with 2 decimal places.  
                            np.savetxt(outfile, data_slice, fmt='%-7.2f')

                            # Writing out a break to indicate different slices...
                            #outfile.write('\n')
                

                    test_errors = [test_model(i) for i in range(n_test_batches)]
                    print "test errors: {:.1%}".format(np.mean(test_errors))
                    with open("workfile_BIG32", "a") as myfile:
                        myfile.write("test errors: {:.1%}\n".format(np.mean(test_errors)))

        except KeyboardInterrupt:
            print '... Exiting solver'
        # Evaluate performance 




        test_errors = [test_model(i) for i in range(n_test_batches)]
        print "test errors: {:.1%}".format(np.mean(test_errors))

        pred = [predict(i) for i in range(n_test_batches)]
        print pred[0].shape
예제 #2
0
    def run(self,
            num_kernels=[25, 25],
            kernel_sizes=[(11, 11), (5, 5)],
            batch_size=256,
            epochs=100000,
            optimizer='RMSprop'):

        optimizerData = {}
        optimizerData['learning_rate'] = 0.0005 / 2
        optimizerData['rho'] = 0.9
        optimizerData['epsilon'] = 1e-2
        optimizerData['momentum'] = 0.9

        print '... Loading data'

        # load in and process data
        if data_size == 'large':
            preProcess = PreProcess()
            data = preProcess.run()
        elif data_size == 'medium':
            preProcess = Medium()
            data = preProcess.run()
        elif data_size == 'small':
            preProcess = Small()
            data = preProcess.run()
        else:
            print 'data_size must be small, medium or large.'
            exit()
        train_set_x, train_set_y = data[0], data[3]
        valid_set_x, valid_set_y = data[1], data[4]
        test_set_x, test_set_y = data[2], data[5]

        train_set_x = theano.tensor._shared(train_set_x, borrow=True)
        valid_set_x = theano.tensor._shared(valid_set_x, borrow=True)
        train_set_y = theano.tensor._shared(train_set_y, borrow=True)
        valid_set_y = theano.tensor._shared(valid_set_y, borrow=True)
        test_set_x = theano.tensor._shared(test_set_x, borrow=True)
        test_set_y = theano.tensor._shared(test_set_y, borrow=True)

        print '... Initializing network'

        # training parameters
        self.n_sports = 500

        # print error if batch size is to large
        if valid_set_y.get_value(borrow=True).size < batch_size:
            print 'Error: Batch size is larger than size of validation set.'

        # compute batch sizes for train/test/validation
        n_train_batches = train_set_x.get_value(borrow=True).shape[0]
        n_valid_batches = valid_set_x.get_value(borrow=True).shape[0]
        n_test_batches = test_set_x.get_value(borrow=True).shape[0]
        n_train_batches /= batch_size
        n_valid_batches /= batch_size
        n_test_batches /= batch_size

        # symbolic variables
        x = T.matrix('x')  # input image data
        y = T.ivector('y')  # input label data

        self.model(batch_size, num_kernels, kernel_sizes, x, y)

        # Initialize parameters and functions
        cost = self.layer3.negative_log_likelihood(y)  # Cost function
        params = self.params  # List of parameters
        grads = T.grad(cost, params)  # Gradient
        index = T.lscalar()  # Index

        # Intialize optimizer
        updates = self.init_optimizer(optimizer, cost, params, optimizerData)

        # Train function
        train_model = theano.function(
            [index],
            cost,
            updates=updates,
            givens={
                x: train_set_x[index * batch_size:(index + 1) * batch_size],
                y: train_set_y[index * batch_size:(index + 1) * batch_size]
            })

        # Validation function
        validate_model = theano.function(
            [index],
            self.layer3.errors(y),
            givens={
                x: valid_set_x[index * batch_size:(index + 1) * batch_size],
                y: valid_set_y[index * batch_size:(index + 1) * batch_size]
            })

        # Test function
        test_model = theano.function(
            [index],
            self.layer3.errors(y),
            givens={
                x: test_set_x[index * batch_size:(index + 1) * batch_size],
                y: test_set_y[index * batch_size:(index + 1) * batch_size]
            })

        def solve():
            costs = []
            for i in xrange(n_train_batches):
                costs.append(train_model(i))
            return costs

        def shuffle(train_set_x, train_set_y):
            #print train_set_x.get_value(borrow=True).shape[0]
            rand = np.random.permutation(
                range(train_set_x.get_value(borrow=True).shape[0]))
            train_set_x.set_value(train_set_x.get_value(borrow=True)[rand],
                                  borrow=True)
            train_set_y.set_value(train_set_y.get_value(borrow=True)[rand],
                                  borrow=True)
            return train_set_x, train_set_y, train_model

        # Solver
        try:
            print '... Solving'
            start_time = time.time()
            for epoch in range(epochs):
                t1 = time.time()
                train_set_x, train_set_y, train_model = shuffle(
                    train_set_x, train_set_y)
                costs = solve()
                validation_losses = [
                    validate_model(i) for i in xrange(n_valid_batches)
                ]
                t2 = time.time()
                print "Epoch {}    NLL {:.2}    %err in validation set {:.1%}    Time (epoch/total) {:.2}/{:.2} mins".format(
                    epoch + 1, np.mean(costs), np.mean(validation_losses),
                    (t2 - t1) / 60., (t2 - start_time) / 60.)
                # f = open('workfile' , 'r+')
                # f.write("Epoch {}    NLL {:.2}    %err in validation set {:.1%}    Time (epoch/total) {:.2}/{:.2} mins".format(epoch + 1, np.mean(costs), np.mean(validation_losses),(t2-t1)/60.,(t2-start_time)/60.))
                # f.close()
                with open("workfile_batch_c", "a") as myfile:
                    myfile.write(
                        "Epoch {}    NLL {:.2}    %err in validation set {:.1%}    Time (epoch/total) {:.2}/{:.2} mins \n"
                        .format(epoch + 1, np.mean(costs),
                                np.mean(validation_losses), (t2 - t1) / 60.,
                                (t2 - start_time) / 60.))
                if epoch % 10 == 0:

                    test_errors = [
                        test_model(i) for i in range(n_test_batches)
                    ]
                    print "test errors: {:.1%}".format(np.mean(test_errors))
                    with open("workfile_batch_c2", "a") as myfile:
                        myfile.write("test errors: {:.1%}\n".format(
                            np.mean(test_errors)))

        except KeyboardInterrupt:
            print '... Exiting solver'
        # Evaluate performance

        predict = theano.function(
            inputs=[index],
            outputs=self.layer3.prediction(),
            givens={
                x: test_set_x[index * batch_size:(index + 1) * batch_size]
            })

        test_errors = [test_model(i) for i in range(n_test_batches)]
        print "test errors: {:.1%}".format(np.mean(test_errors))

        pred = [predict(i) for i in range(n_test_batches)]
        print pred[0].shape
    def run(self,
            num_kernels  = [1,1],
            kernel_sizes = [(11, 11), (5, 5)],
            batch_size   = 50,
            epochs       = 10,
            optimizer    = 'RMSprop'):
            
            
        optimizerData = {}
        optimizerData['learning_rate'] = 0.001
        optimizerData['rho']           = 0.9
        optimizerData['epsilon']       = 1e-4
        optimizerData['momentum']      = 0.9
        
        print '... Loading data'
        
        # load in and process data
        if small == False:
            preProcess              = PreProcess()
            data                    = preProcess.run()
        else:
            preProcess             = Small()
            data                    = preProcess.run()            
        train_set_x,train_set_y = data[0],data[3]
        valid_set_x,valid_set_y = data[1],data[4]
        test_set_x,test_set_y   = data[2],data[5]

        #print train_set_x.shape

        print '... Initializing network'
       
        # training parameters
        #self.n_sports = np.max(train_set_y.eval())+1
        self.n_sports = np.max(train_set_y)+1
        # print error if batch size is to large
        
       # if valid_set_y.eval().size<batch_size:
        if valid_set_y.size<batch_size:
            print 'Error: Batch size is larger than size of validation set.'

        train_set_x = theano.shared(train_set_x)
        train_set_y = theano.shared(train_set_y)
        test_set_x = theano.shared(test_set_x)
        test_set_y = theano.shared(test_set_y)
        valid_set_x = theano.shared(valid_set_x)
        valid_set_y = theano.shared(valid_set_y)


        # compute batch sizes for train/test/validation
        n_train_batches  = train_set_x.get_value(borrow=True).shape[0]
        n_test_batches   = test_set_x.get_value(borrow=True).shape[0]
        n_valid_batches  = valid_set_x.get_value(borrow=True).shape[0]
        n_train_batches /= batch_size
        n_test_batches  /= batch_size
        n_valid_batches /= batch_size

        # symbolic variables
        x = T.matrix('x')  # input image data
        y = T.ivector('y')  # input label data
        
        self.model(batch_size, num_kernels, kernel_sizes, x, y)

        # Initialize parameters and functions
        cost   = self.layer3.negative_log_likelihood(y)        # Cost function
        params = self.params                                   # List of parameters
        grads  = T.grad(cost, params)                          # Gradient
        index  = T.lscalar()                                   # Index
        
        # Intialize optimizer
        updates = self.init_optimizer(optimizer, cost, params, optimizerData)

        # Training model
        train_model = theano.function(
                      [index],
                      cost,
                      updates = updates,
                      givens  = {
                                x: train_set_x[index * batch_size: (index + 1) * batch_size], 
                                y: train_set_y[index * batch_size: (index + 1) * batch_size] 
            }
        )

        # Validation function
        validate_model = theano.function(
                         [index],
                         self.layer3.errors(y),
                         givens = {
                                  x: valid_set_x[index * batch_size: (index + 1) * batch_size],
                                  y: valid_set_y[index * batch_size: (index + 1) * batch_size]
                }
            )

        # Test function
        test_model = theano.function(
                     [index],
                     self.layer3.errors(y),
                     givens = {
                              x: test_set_x[index * batch_size: (index + 1) * batch_size],
                              y: test_set_y[index * batch_size: (index + 1) * batch_size]
            }
        )
        
        # Solver
        try:
            print '... Solving'
            start_time = time.time()    
            for epoch in range(epochs):
                t1 = time.time()
                costs             = [train_model(i) for i in xrange(n_train_batches)]
                validation_losses = [validate_model(i) for i in xrange(n_valid_batches)]
                t2 = time.time()
                print "Epoch {}    NLL {:.2}    %err in validation set {:.1%}    Time (epoch/total) {:.2}/{:.2} mins".format(epoch + 1, np.mean(costs), np.mean(validation_losses),(t2-t1)/60.,(t2-start_time)/60.)
        except KeyboardInterrupt:
            print '... Exiting solver'
        # Evaluate performance 
        test_errors = [test_model(i) for i in range(n_test_batches)]
        print "test errors: {:.1%}".format(np.mean(test_errors))