Example #1
0
class NNAgent(Agent):

    def __init__(self, buy_in, n_players, ID=0):
        self.n_opponents = n_players - 1
        self.states = [buy_in, 0, None]   # [current funds, bet amount, action]
        self.earnings = 0
        self.id = ID
        self.evaluator = Evaluator()

        self.n_opponents = n_players - 1
        self.earnings = 0
        self.id = ID
        self.evaluator = Evaluator()

        self.num_opp_actions = 5
        self.num_feature_elements = 52 + (self.num_opp_actions * self.n_opponents) + 3
        self.batch_size = 50000 # could have this as a parameter

        # initialize neural network
        self.network = NeuralNetwork(test_mnist=False, input_layer_size=self.num_feature_elements)

        # array of feature vectors
        self.X_train = np.empty([self.batch_size, self.num_feature_elements])
        # array of target values (i.e. Q(feature vector))
        self.y_train = np.empty([self.batch_size, 1])        

        self.prev_state_action_vector = None
        self.e = 0.3 # value for e-greedy
        self.iteration_num = 0
    
    # get output of neural network
    def Q(self, vector):
        return self.network.predict(vector)

    def trainQ(self):
        self.network.updateData(train_data=self.X_train, train_labels=self.y_train, input_layer_size=self.num_feature_elements)
        self.network.train(num_epochs=10)

    def getAction(self, game, call, raise_amt):
        cur_funds = self.states[0]
        cur_bet = self.states[1]
        diff = call - cur_bet
        raise_bet = diff + raise_amt

        action = None

        # can't call 
        if diff > cur_funds:
            action = 'F'

        # can't raise
        if raise_bet > cur_funds:
            action_set = ['F', 'C']

        # can do anything
        else:   
            action_set = ['F', 'C', 'R']        

        # 52 elements to represent the hand, number opponents elements * 3 elements to represent last actions, 3 elements to represent agents action
        state_action_vector = np.zeros(52 + self.num_opp_actions * self.n_opponents + 3)

        # indicating the hand
        state_action_vector[getCardNum(self.hole_cards[0])] = 1
        state_action_vector[getCardNum(self.hole_cards[1])] = 1
        
        other_player_actions = tuple(game.last_player_actions)
        # indicating the opp. actions
        for i in xrange(self.n_opponents):
            state_action_vector[52 + self.num_opp_actions * i + action_numbers[other_player_actions[i]]] = 1
    
        num_state_features = 52 + (self.num_opp_actions * self.n_opponents)
        
        if not action:
            # net has not been trained yet
            if self.iteration_num < self.batch_size:
                max_action_value = 0
                action = random.choice(action_set)

            else:
                r = random.uniform(0, 1)
                
                max_action_value = -np.inf
                max_legal_action_value = -np.inf # might not be able to do every action

                # choose best possible action
                for (i, a) in enumerate(actions):
                    state_action_vector[num_state_features + i] = 1
                    action_value = self.Q(state_action_vector)

                    if action_value > max_action_value: 
                        max_action_value = action_value
                    
                    if a in action_set:
                        if action_value > max_legal_action_value:
                            max_legal_action_value = action_value
                            action = a

                    state_action_vector[num_state_features + i] = 0

                # e-greedy exploration
                if r < self.e:
                    action = random.choice(action_set)

        else:
            max_action_value = 0
                
        # print action
        state_action_vector[num_state_features + action_numbers[action]] = 1

        if self.prev_state_action_vector is not None:
            self.X_train[self.iteration_num % self.batch_size] = self.prev_state_action_vector
            self.y_train[self.iteration_num % self.batch_size] = np.array(max_action_value)

            self.iteration_num += 1
            if self.iteration_num % self.batch_size == 0:
                self.trainQ()

        self.prev_state_action_vector = state_action_vector

        return action

    # add reward to training set
    def QReward(self, reward):
        if self.prev_state_action_vector is not None:
            self.X_train[self.iteration_num % self.batch_size] = self.prev_state_action_vector
            self.y_train[self.iteration_num % self.batch_size] = np.array(reward)

            self.iteration_num += 1
            if self.iteration_num % self.batch_size == 0:
                self.trainQ()

            self.prev_state_action_vector = None
Example #2
0
def main():

    script = str(sys.argv[1])

    epochs = 3000
    # script = 'example'

    if script == "example":

        x = np.array([[0.05, 0.1]])
        y = np.array([[0.01, 0.99]])

        desired_y = np.array([[0.773, 0.778]])  # After one training step (epoch)

        parameters = {
            "num inputs" : 2,
            "num outputs" : 2,
            "num hidden layers" : 1,
            "num neurons" : 2,
            "activations": ['sigmoid'] * 2,
            "learning rate": 0.5,
            "loss function": 'squared error'
        }

        nn = NeuralNetwork(parameters)

        # In this example, don't use randomly-initialized weights - use the ones from the example. So, to make things
        # simple, just over-write the existing, randomly-initialized weights from the NeuralNetwork instantiation.
        weights = np.array([[0.15, 0.20, 0.25, 0.30], [0.40, 0.45, 0.50, 0.55]])
        biases = np.array([[0.35, 0.35], [0.60, 0.60]])

        for l in range(0, len(nn.layers)):
            nn.layers[l].weights = weights[l]
            nn.layers[l].biases = biases[l]

        nn.layers[0].neurons[0].weights = weights[0, 0:2]
        nn.layers[0].neurons[1].weights = weights[0, 2::]
        nn.layers[0].neurons[0].bias = biases[0, 0]
        nn.layers[0].neurons[1].bias = biases[0, 1]

        nn.layers[1].neurons[0].weights = weights[1, 0:2]
        nn.layers[1].neurons[1].weights = weights[1, 2::]
        nn.layers[1].neurons[0].bias = biases[1, 0]
        nn.layers[1].neurons[1].bias = biases[1, 1]

        nn.train(x, y, epochs=1)

        new_output = nn.calculate(x)

        # Print to screen
        print('\n')
        print('Class example: single epoch')
        print('--------------------------------------------------------------------------------')
        print('Initial output is: {}. After one training step, the next output should be {}, (with sigmoid activation).'.format(y, desired_y))
        print('New output is... {}'.format(new_output))

    elif script == "and":

        x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
        y = np.array([0, 0, 0, 1])

        parameters = {
            "num inputs": 2,
            "num outputs": 1,
            "num hidden layers": 0,
            "num neurons": 0,
            "activations": ['sigmoid'],
            "learning rate": 0.1,
            "loss function": 'squared error'
        }

        nn = NeuralNetwork(parameters)

        nn.train(x, y, epochs=epochs)

        # Plotting
        plt.plot(nn.loss_epoch)
        plt.grid()
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.title('AND Neural Network, {} activation and \n {} loss'.format(parameters['activations'][0], parameters['loss function']))
        plt.show()

        # Printing to screen
        print('\n')
        print('AND Gate Perceptron:')
        print('--------------------------------------------------------------------------------')
        print('For y = 1, output should be >= 0.5. For y = 0, output should be < 0.5.')
        for input, output in zip(x, y):
            print("MULTI-LAYER PERCEPTRON: Output for input x = {} should be y = {}. Computed value: {}".format(input,
                                                                                                                output,
                                                                                                                nn.calculate(
                                                                                                                    input)))

    elif script == "xor":

        x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
        y = np.array([0, 1, 1, 0])

        parameters_perceptron = {

            "num inputs": 2,
            "num outputs": 1,
            "num hidden layers": 0,
            "num neurons": 0,
            "activations": ['sigmoid'],
            "learning rate": 0.1,
            "loss function": 'squared error'
        }

        parameters_multilayer_perceptron = {

            "num inputs": 2,
            "num outputs": 1,
            "num hidden layers": 1,
            "num neurons": 4,
            "activations": ['sigmoid'] * 2,
            "learning rate": 0.1,
            "loss function": 'squared error'

        }

        nn_single = NeuralNetwork(parameters_perceptron)
        nn_single.train(x, y, epochs=epochs)

        nn_multi = NeuralNetwork(parameters_multilayer_perceptron)
        nn_multi.train(x, y, epochs=epochs)

        # Plotting
        plt.plot(nn_single.loss_epoch, label='Single Perceptron')
        plt.ylabel('Loss')
        plt.plot(nn_multi.loss_epoch, label='Multi-layer Perceptron')
        plt.grid()
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.legend(loc='upper right')
        plt.title('XOR Neural Network {} activation and \n {} loss'.format(
            parameters_multilayer_perceptron['activations'][0], parameters_multilayer_perceptron['loss function']))
        plt.show()

        # Printing results to screen
        print('\n')
        print('XOR Gate: Single-layer Perceptron:')
        print('--------------------------------------------------------------------------------')
        print('For y = 1, output should be >= 0.5. For y = 0, output should be < 0.5.')
        for input, output in zip(x, y):
            print("SINGLE PERCEPTRON: Output for input x = {} should be y = {}. Computed value: {}".format(input, output, nn_single.calculate(input)))

        print('\n')
        print('XOR Gate: Multi-layer Perceptron:')
        print('--------------------------------------------------------------------------------')
        print('For y = 1, output should be >= 0.5. For y = 0, output should be < 0.5.')
        for input, output in zip(x, y):
            print("MULTI-LAYER PERCEPTRON: Output for input x = {} should be y = {}. Computed value: {}".format(input, output,
                                                                                                           nn_multi.calculate(
                                                                                                               input)))
Example #3
0
        kb = []
        testKB = []
        for i in range(10000):
            kb.append((generateDispensableCard(), [1]))
            kb.append((generateIndispensableCard(), [0]))
        for i in range(1000):
            testKB.append((generateDispensableCard(), [1]))
            testKB.append((generateIndispensableCard(), [0]))

        untrainedErrorOnKB = nn.test(knowledgeBase=kb)
        print("untrainedErrorOnKB : ", untrainedErrorOnKB)

        untrainedErrorOnTest = nn.test(knowledgeBase=testKB)
        print("untrainedErrorOnTest : ", untrainedErrorOnTest)

        for i in range(1000):
            test = False
            if not i % 20:
                test = True
                trainedErrorOnKBi = nn.train(knowledgeBase=kb, doTests=test)
                print("trainedErrorOnKB", i, " :", trainedErrorOnKBi)
            else:
                trainedErrorOnKBi = nn.train(knowledgeBase=kb, doTests=test)

        trainedErrorOnKB1000 = nn.test(knowledgeBase=kb)
        print("trainedErrorOnKB1000 : ", trainedErrorOnKB1000)
        trainedErrorOnTest = nn.test(knowledgeBase=testKB)
        print("trainedErrorOnTest : ", trainedErrorOnTest)

        print()
Example #4
0
if __name__ == '__main__':
    for i in range(10):
        seed = random.randint(-65536, 65535)
        random.seed(seed)
        nn = NeuralNetwork(neuronsPerLayer=[27, 50, 5, 1])
        kb = []
        testKB = []
        for i in range(10000):
            kb.append((generateDispensableCard(), [1]))
            kb.append((generateIndispensableCard(), [0]))

        for i in range(1000):
            testKB.append((generateDispensableCard(), [1]))
            testKB.append((generateIndispensableCard(), [0]))

        untrainedErrorOnKB = nn.test(knowledgeBase=kb)
        untrainedErrorOnTest = nn.test(knowledgeBase=testKB)
        trainedErrorOnKB1 = nn.train(knowledgeBase=kb)
        for _ in range(1000):
            nn.train(knowledgeBase=kb, doTests=False)
        trainedErrorOnKB1000 = nn.test(knowledgeBase=kb)
        trainedErrorOnTest = nn.test(knowledgeBase=testKB)

        print("untrainedErrorOnKB : ", untrainedErrorOnKB)
        print("untrainedErrorOnTest : ", untrainedErrorOnTest)
        print("trainedErrorOnKB1 : ", trainedErrorOnKB1)
        print("trainedErrorOnKB1000 : ", trainedErrorOnKB1000)
        print("trainedErrorOnTest : ", trainedErrorOnTest)
        print("seed : ", seed)
        print()
Example #5
0
        card.setValue(random.randint(1, 5))
    return (Suit.toInt(fireWork.getSuit()), fireWork.getValue(),
            Suit.toInt(card.getSuit()), card.getValue())


if __name__ == '__main__':
    nn = NeuralNetwork(neuronsPerLayer=[4, 4, 1])
    trainKB = []
    testKB = []
    for i in range(2000):
        trainKB.append((generateGoodCombo(), [1]))
        trainKB.append((generateBadCombo(), [0]))
        testKB.append((generateGoodCombo(), [1]))
        testKB.append((generateBadCombo(), [0]))

    untrainedErrorOnKB = nn.test(knowledgeBase=trainKB)
    untrainedErrorOnTest = nn.test(knowledgeBase=testKB)
    trainedErrorOnKB1 = nn.train(knowledgeBase=trainKB)
    for _ in range(10):
        nn.train(knowledgeBase=trainKB, doTests=False)
    print()
    trainedErrorOnKB10 = nn.test(knowledgeBase=trainKB)
    trainedErrorOnTest = nn.test(knowledgeBase=testKB)

    print("untrainedErrorOnKB : ", untrainedErrorOnKB)
    print("untrainedErrorOnTest : ", untrainedErrorOnTest)
    print("trainedErrorOnKB1 : ", trainedErrorOnKB1)
    print("trainedErrorOnKB10 : ", trainedErrorOnKB10)
    print("trainedErrorOnTest : ", trainedErrorOnTest)
    print()
Example #6
0
    cost = ((test_y['pred_survived'] - test_y['Survived'])**2).mean()
    test_y = test_y[['pred_survived']]
    test_y.columns = ['Survived']
    return test_y, cost


if __name__ == '__main__':
    x, y = prep_train_data()
    test_x, test_y = prep_test_data()
    h_layers = [10, 10]
    inputs = x.values
    outputs = y.values
    nn = NeuralNetwork(n_inputs=4,
                       n_outputs=2,
                       h_layers=h_layers,
                       inputs=inputs,
                       expected_outputs=outputs)
    nn.open_session()
    nn.make_model(is_weights_rand=True)
    nn.make_tensor_board()
    s = time.time()
    nn.train(epochs=999, learning_rate=0.01, isliveplot=False)
    raw_outputs, _ = nn.test(test_inputs=test_x.values,
                             test_outputs=test_y.values)
    test_y, cost = categorize_output(raw_outputs, test_y)
    test_y.to_csv('./data/my_submission.csv')
    print('cost: ', cost)
    e = time.time() - s
    print("Training took ", e, "seconds")
    nn.close_session()
    nn.plot()
Example #7
0
        [7.54, 1.88],
        [6.77, 3.56],
        [9.0, 2.56],
        [8.0, 2.0],
        [2.31, 11.0],
        [7.0, 4.5]
    ], dtype=float)

    answers = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], dtype=float)

    nn = NeuralNetwork(2, 3, 1, 0.1)

    # training neural network
    for i in range(0, 100000):
        random_index = np.random.randint(0, np.size(answers))
        nn.train(inputs[random_index], answers[random_index])

    print("Training Complete\n")

    # Get insect dimension from end user
    input_width = float(input("Enter insect width:\t\t"))
    input_length = float(input("Enter insect length:\t"))

    # Get a trained guess
    output = nn.feed_forward([input_width, input_length])

    print("\nOUTPUT\n------")
    if output < 0.5:
        print("Ladybird")
    else:
        print("Stick Insect")