diff --git a/main.py b/main.py new file mode 100644 index 0000000..fdeff2b --- /dev/null +++ b/main.py @@ -0,0 +1,76 @@ +import numpy as np # helps with the math +import matplotlib.pyplot as plt # to plot error during training + +# input data +inputs = np.array([[0, 0, 1, 0], + [0, 0, 1, 1], + [0, 0, 0, 0], + [1, 1, 0, 0], + [1, 1, 1, 1], + [1, 1, 0, 1]]) +# output data +outputs = np.array([[0], [0], [0], [1], [1], [1]]) + +# create NeuralNetwork class +class NeuralNetwork: + + # intialize variables in class + def __init__(self, inputs, outputs): + self.inputs = inputs + self.outputs = outputs + # initialize weights as .50 for simplicity + self.weights = np.array([[.50], [.50], [.50], [0.50]]) + self.error_history = [] + self.epoch_list = [] + + #activation function ==> S(x) = 1/1+e^(-x) + def sigmoid(self, x, deriv=False): + if deriv == True: + return x * (1 - x) + return 1 / (1 + np.exp(-x)) + + # data will flow through the neural network. + def feed_forward(self): + self.hidden = self.sigmoid(np.dot(self.inputs, self.weights)) + + # going backwards through the network to update weights + def backpropagation(self): + self.error = self.outputs - self.hidden + delta = self.error * self.sigmoid(self.hidden, deriv=True) + self.weights += np.dot(self.inputs.T, delta) + + # train the neural net for 25,000 iterations + def train(self, epochs=25000): + for epoch in range(epochs): + # flow forward and produce an output + self.feed_forward() + # go back though the network to make corrections based on the output + self.backpropagation() + # keep track of the error history over each epoch + self.error_history.append(np.average(np.abs(self.error))) + self.epoch_list.append(epoch) + + # function to predict output on new and unseen input data + def predict(self, new_input): + prediction = self.sigmoid(np.dot(new_input, self.weights)) + return prediction + +# create neural network +NN = NeuralNetwork(inputs, outputs) +# train neural network +NN.train() + +# create two new examples to predict +example = np.array([[1, 1, 1, 0]]) +example_2 = np.array([[0, 0, 1, 1]]) + +# print the predictions for both examples +print(NN.predict(example), ' - Correct: ', example[0][0]) +print(NN.predict(example_2), ' - Correct: ', example_2[0][0]) + +# plot the error over the entire training duration +plt.figure(figsize=(15,5)) +plt.plot(NN.epoch_list, NN.error_history) +plt.xlabel('Epoch') +plt.ylabel('Error') +plt.savefig('plot.png') \ No newline at end of file