Exemplo n.º 1
0
    def test_5(self):
        # Comprehensive gradient checking #

        # Medium size data-set with more than two classes
        arrs = []
        labels = []
        classes = ("cat", "dog", "bird", "turtle", "dinosaur", "human")
        for m in range(0, 100):
            arr = [random.random() for x in range(0, 200)]
            z = random.random()
            if z < 1 / 6:
                label = classes[0]
            elif z >= 1 / 6 and z < 2 / 6:
                label = classes[1]
            elif z >= 2 / 6 and z < 3 / 6:
                label = classes[2]
            elif z >= 3 / 6 and z < 4 / 6:
                label = classes[3]
            elif z >= 4 / 6 and z < 5 / 6:
                label = classes[4]
            else:
                label = classes[5]
            arrs.append(arr)
            labels.append(label)
        ann = Ann(arrs, labels, n_h=2)  # Create Ann with these train_examples and labels
        # L-1 matrices of partial derivatives for first example
        J = ann.backward_batch()
        T_original = copy.deepcopy(ann.Thetas)

        # Just check the neuron connections between first, second, and third layer
        for l in range(0, 2):
            shape_J = J[l].shape
            eps = 0.0001  # epsilon for a numerical approximation of the gradient
            # Randomly select 100 neuron connections to check
            a = random.sample(range(0, shape_J[0]), 10)
            b = random.sample(range(0, shape_J[1]), 10)
            for i in a:
                for j in b:
                    T_e = np.zeros(shape_J)  # Matrix of zeros
                    T_e[i][j] = eps
                    ann.Thetas[l] = T_original[l] + T_e
                    cost_e = ann.cost()  # Cost at Theta + eps
                    ann.Thetas[l] = T_original[l] - T_e
                    cost_minus_e = ann.cost()  # Cost at Theta - eps
                    P = (cost_e - cost_minus_e) / (2 * eps)  # Numerical approximation
                    J_ij = J[l].item(i, j)  # Backpropagation derivation

                    print(P, "\t", J_ij, "\t", abs(P - J_ij), (l, i, j))

                    # if (P < 0 and J_ij > 0 or P > 0 and J_ij < 0):
                    #    self.fail()

                    self.assertAlmostEqual(P, J_ij, delta=0.001)
                    ann.Thetas = copy.deepcopy(T_original)
    def test_5(self):
        # Comprehensive gradient checking #

        # Medium size data-set with more than two classes
        arrs = []
        labels = []
        classes = ('cat', 'dog', 'bird', 'turtle', 'dinosaur', 'human')
        for m in range(0, 100):
            arr = [random.random() for x in range(0, 200)]
            z = random.random()
            if (z < 1 / 6):
                label = classes[0]
            elif (z >= 1 / 6 and z < 2 / 6):
                label = classes[1]
            elif (z >= 2 / 6 and z < 3 / 6):
                label = classes[2]
            elif (z >= 3 / 6 and z < 4 / 6):
                label = classes[3]
            elif (z >= 4 / 6 and z < 5 / 6):
                label = classes[4]
            else:
                label = classes[5]
            arrs.append(arr)
            labels.append(label)
        ann = Ann(arrs, labels,
                  n_h=2)  # Create Ann with these train_examples and labels
        # L-1 matrices of partial derivatives for first example
        J = ann.backward_batch()
        T_original = copy.deepcopy(ann.Thetas)

        # Just check the neuron connections between first, second, and third layer
        for l in range(0, 2):
            shape_J = J[l].shape
            eps = 0.0001  # epsilon for a numerical approximation of the gradient
            # Randomly select 100 neuron connections to check
            a = random.sample(range(0, shape_J[0]), 10)
            b = random.sample(range(0, shape_J[1]), 10)
            for i in a:
                for j in b:
                    T_e = np.zeros(shape_J)  # Matrix of zeros
                    T_e[i][j] = eps
                    ann.Thetas[l] = T_original[l] + T_e
                    cost_e = ann.cost()  # Cost at Theta + eps
                    ann.Thetas[l] = T_original[l] - T_e
                    cost_minus_e = ann.cost()  # Cost at Theta - eps
                    P = (cost_e - cost_minus_e) / (2 * eps
                                                   )  # Numerical approximation
                    J_ij = J[l].item(i, j)  # Backpropagation derivation

                    self.assertAlmostEqual(P, J_ij, delta=0.001)
                    ann.Thetas = copy.deepcopy(T_original)
Exemplo n.º 3
0
    def test_8(self):
        # First test#
        # 1 hidden layer cost test with regularization#       
        x1 = [1, 2, 3, 4]  # Array as first example
        y1 = 'yes'
        arrs = []
        labels = []
        arrs.append(x1)
        labels.append(y1)
        ann1 = Ann(arrs, labels, n_h=1)  # Create this architecture
         
        # Custom Thetas weights#
        M1 = np.matrix([[1, -1, 0.5, -0.3, 2],
                       [1, -1, 0.5, -0.3, 2],
                       [1, -1, 0.5, -0.3, 2],
                       [1, -1, 0.5, -0.3, 2]])
        M2 = np.matrix([[1, 1, -1, 0.5, -1]])
        ann1.Thetas[0] = M1
        ann1.Thetas[1] = M2
        cost_0 = ann1.cost()  # lam equals 0
        cost_1 = ann1.cost(lam=1)  # lam equals 1
        self.assertTrue(cost_1 > cost_0)  # Cost with regularization penalty is always higher than without regularization        
 
        # Gradient checking (now with regularization)#
        # Medium size data-set with several train_examples
        lam_test = 1  # Regularization parameter
        arrs = []
        labels = []
        classes = ('cat', 'dog')
        for m in range(0, 100):
            arr = [random.random() for x in range(0, 40)]
            label = classes[random.random() > 0.5]
            arrs.append(arr)
            labels.append(label)
        ann = Ann(arrs, labels, n_h=2)  # Create Ann with these train_examples and labels
        # L-1 matrices of partial derivatives for first example
        J = ann.backward_batch(lam=lam_test, batch_size=1)  # Use full-batch for gradient descent
        T_original = copy.deepcopy(ann.Thetas)
         
        for l in range(0, ann.L - 1):
            shape_J = J[l].shape
            eps = 0.0001  # epsilon for a numerical approximation of the gradient
            a = random.sample(range(0, shape_J[0]), 2)
            b = random.sample(range(0, shape_J[1]), 2)
            for i in a:
                for j in b:
                    T_e = np.zeros(shape_J)  # Matrix of zeros
                    T_e[i][j] = eps
                    ann.Thetas[l] = T_original[l] + T_e
                    cost_e = ann.cost(lam=lam_test)  # Cost at Theta + eps
                    ann.Thetas[l] = T_original[l] - T_e
                    cost_minus_e = ann.cost(lam=lam_test)  # Cost at Theta - eps
                    P = (cost_e - cost_minus_e) / (2 * eps)  # Numerical approximation
                    J_ij = J[l].item(i, j)  # Backpropagation derivation
                     
                    # print(P, '\t', J_ij, '\t', abs(P - J_ij), (l, i, j))
                     
                    # if (P < 0 and J_ij > 0 or P > 0 and J_ij < 0):
                    #    self.fail()
                     
                    self.assertAlmostEqual(P, J_ij, delta=0.001)
                    ann.Thetas = copy.deepcopy(T_original)
Exemplo n.º 4
0
 def test_4(self):
     # Gradient checking (check that a numerical approximation of the gradient is (almost) equal to our backpropagation derivation)#
      
     # First data-set with one example
     arrs = []
     labels = []
     arrs.append([1, 2, 4, 5, 5, 5])
     labels.append('cat')
     ann = Ann(arrs, labels, n_h=10)  # Create Ann with these train_examples and labels
     J = ann.backward(ann.train_examples[0].arr, ann.train_examples[0].y)
     T_original = copy.deepcopy(ann.Thetas)
      
     for l in range(0, ann.L - 1):
         shape_J = J[l].shape
         eps = 0.0001  # epsilon for a numerical approximation of the gradient
         for i in range(0, shape_J[0]):
             for j in range(0, shape_J[1]):
                 T_e = np.zeros(shape_J)  # Matrix of zeros
                 T_e[i][j] = eps
                 ann.Thetas[l] = T_original[l] + T_e
                 cost_e = ann.cost()  # Cost at Theta + eps
                 ann.Thetas[l] = T_original[l] - T_e
                 cost_minus_e = ann.cost()  # Cost at Theta - eps
                 P = (cost_e - cost_minus_e) / (2 * eps)  # Numerical approximation
                 J_ij = J[l].item(i, j)  # Backpropagation derivation
                  
                 # print(P, '\t', J_ij, '\t', abs(P - J_ij), (l, i, j))
                  
                 # if (P < 0 and J_ij > 0 or P > 0 and J_ij < 0):
                 #    self.fail()
                  
                 self.assertAlmostEqual(P, J_ij, delta=0.001)
                 ann.Thetas = copy.deepcopy(T_original)
      
     # Second data-set with several train_examples
     arrs = []
     labels = []
     classes = ('cat', 'dog')
     for m in range(0, 100):
         arr = [random.random() for x in range(0, 20)]
         label = classes[random.random() > 0.5]
         arrs.append(arr)
         labels.append(label)
     ann = Ann(arrs, labels, n_h=2)  # Create Ann with these train_examples and labels
     # L-1 matrices of partial derivatives for first example
     J = ann.backward_batch()
     T_original = copy.deepcopy(ann.Thetas)
      
     for l in range(0, ann.L - 1):
         shape_J = J[l].shape
         eps = 0.0001  # epsilon for a numerical approximation of the gradient
         a = random.sample(range(0, shape_J[0]), 2)
         b = random.sample(range(0, shape_J[1]), 2)
         for i in a:
             for j in b:
                 T_e = np.zeros(shape_J)  # Matrix of zeros
                 T_e[i][j] = eps
                 ann.Thetas[l] = T_original[l] + T_e
                 cost_e = ann.cost()  # Cost at Theta + eps
                 ann.Thetas[l] = T_original[l] - T_e
                 cost_minus_e = ann.cost()  # Cost at Theta - eps
                 P = (cost_e - cost_minus_e) / (2 * eps)  # Numerical approximation
                 J_ij = J[l].item(i, j)  # Backpropagation derivation
                  
                 self.assertAlmostEqual(P, J_ij, delta=0.001)
                 ann.Thetas = copy.deepcopy(T_original)
    def test_8(self):
        # First test#
        # 1 hidden layer cost test with regularization#
        x1 = [1, 2, 3, 4]  # Array as first example
        y1 = 'yes'
        arrs = []
        labels = []
        arrs.append(x1)
        labels.append(y1)
        ann1 = Ann(arrs, labels, n_h=1)  # Create this architecture

        # Custom Thetas weights#
        M1 = np.matrix([[1, -1, 0.5, -0.3, 2], [1, -1, 0.5, -0.3, 2],
                        [1, -1, 0.5, -0.3, 2], [1, -1, 0.5, -0.3, 2]])
        M2 = np.matrix([[1, 1, -1, 0.5, -1]])
        ann1.Thetas[0] = M1
        ann1.Thetas[1] = M2
        cost_0 = ann1.cost()  # lam equals 0
        cost_1 = ann1.cost(lam=1)  # lam equals 1
        self.assertTrue(
            cost_1 > cost_0
        )  # Cost with regularization penalty is always higher than without regularization

        # Gradient checking (now with regularization)#
        # Medium size data-set with several train_examples
        lam_test = 1  # Regularization parameter
        arrs = []
        labels = []
        classes = ('cat', 'dog')
        for m in range(0, 100):
            arr = [random.random() for x in range(0, 40)]
            label = classes[random.random() > 0.5]
            arrs.append(arr)
            labels.append(label)
        ann = Ann(arrs, labels,
                  n_h=2)  # Create Ann with these train_examples and labels
        # L-1 matrices of partial derivatives for first example
        J = ann.backward_batch(
            lam=lam_test, batch_size=1)  # Use full-batch for gradient descent
        T_original = copy.deepcopy(ann.Thetas)

        for l in range(0, ann.L - 1):
            shape_J = J[l].shape
            eps = 0.0001  # epsilon for a numerical approximation of the gradient
            a = random.sample(range(0, shape_J[0]), 2)
            b = random.sample(range(0, shape_J[1]), 2)
            for i in a:
                for j in b:
                    T_e = np.zeros(shape_J)  # Matrix of zeros
                    T_e[i][j] = eps
                    ann.Thetas[l] = T_original[l] + T_e
                    cost_e = ann.cost(lam=lam_test)  # Cost at Theta + eps
                    ann.Thetas[l] = T_original[l] - T_e
                    cost_minus_e = ann.cost(
                        lam=lam_test)  # Cost at Theta - eps
                    P = (cost_e - cost_minus_e) / (2 * eps
                                                   )  # Numerical approximation
                    J_ij = J[l].item(i, j)  # Backpropagation derivation

                    # print(P, '\t', J_ij, '\t', abs(P - J_ij), (l, i, j))

                    # if (P < 0 and J_ij > 0 or P > 0 and J_ij < 0):
                    #    self.fail()

                    self.assertAlmostEqual(P, J_ij, delta=0.001)
                    ann.Thetas = copy.deepcopy(T_original)
    def test_4(self):
        # Gradient checking (check that a numerical approximation of the gradient is (almost) equal to our backpropagation derivation)#

        # First data-set with one example
        arrs = []
        labels = []
        arrs.append([1, 2, 4, 5, 5, 5])
        labels.append('cat')
        ann = Ann(arrs, labels,
                  n_h=10)  # Create Ann with these train_examples and labels
        J = ann.backward(ann.train_examples[0].arr, ann.train_examples[0].y)
        T_original = copy.deepcopy(ann.Thetas)

        for l in range(0, ann.L - 1):
            shape_J = J[l].shape
            eps = 0.0001  # epsilon for a numerical approximation of the gradient
            for i in range(0, shape_J[0]):
                for j in range(0, shape_J[1]):
                    T_e = np.zeros(shape_J)  # Matrix of zeros
                    T_e[i][j] = eps
                    ann.Thetas[l] = T_original[l] + T_e
                    cost_e = ann.cost()  # Cost at Theta + eps
                    ann.Thetas[l] = T_original[l] - T_e
                    cost_minus_e = ann.cost()  # Cost at Theta - eps
                    P = (cost_e - cost_minus_e) / (2 * eps
                                                   )  # Numerical approximation
                    J_ij = J[l].item(i, j)  # Backpropagation derivation

                    # print(P, '\t', J_ij, '\t', abs(P - J_ij), (l, i, j))

                    # if (P < 0 and J_ij > 0 or P > 0 and J_ij < 0):
                    #    self.fail()

                    self.assertAlmostEqual(P, J_ij, delta=0.001)
                    ann.Thetas = copy.deepcopy(T_original)

        # Second data-set with several train_examples
        arrs = []
        labels = []
        classes = ('cat', 'dog')
        for m in range(0, 100):
            arr = [random.random() for x in range(0, 20)]
            label = classes[random.random() > 0.5]
            arrs.append(arr)
            labels.append(label)
        ann = Ann(arrs, labels,
                  n_h=2)  # Create Ann with these train_examples and labels
        # L-1 matrices of partial derivatives for first example
        J = ann.backward_batch()
        T_original = copy.deepcopy(ann.Thetas)

        for l in range(0, ann.L - 1):
            shape_J = J[l].shape
            eps = 0.0001  # epsilon for a numerical approximation of the gradient
            a = random.sample(range(0, shape_J[0]), 2)
            b = random.sample(range(0, shape_J[1]), 2)
            for i in a:
                for j in b:
                    T_e = np.zeros(shape_J)  # Matrix of zeros
                    T_e[i][j] = eps
                    ann.Thetas[l] = T_original[l] + T_e
                    cost_e = ann.cost()  # Cost at Theta + eps
                    ann.Thetas[l] = T_original[l] - T_e
                    cost_minus_e = ann.cost()  # Cost at Theta - eps
                    P = (cost_e - cost_minus_e) / (2 * eps
                                                   )  # Numerical approximation
                    J_ij = J[l].item(i, j)  # Backpropagation derivation

                    self.assertAlmostEqual(P, J_ij, delta=0.001)
                    ann.Thetas = copy.deepcopy(T_original)