Skip to content

Commit 2a47505

Browse files
committed
Moved calculate_MSE into neural network.
1 parent 0c5f4b1 commit 2a47505

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

main.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,60 @@
44

55

66
class NeuralNetwork:
7-
87
def __init__(self, layer_sizes, layer_activations, learning_rate=0.1, low=-2, high=2):
98
assert len(layer_sizes) >= 2
109
assert len(layer_sizes)-1 == len(layer_activations)
1110

1211
# Initialize weights between every neuron in all adjacent layers.
13-
self.weights = [np.random.uniform(low, high, (layer_sizes[i-1], layer_sizes[i])) for i in range(1, len(layer_sizes))]
12+
self.weights = np.array([np.random.uniform(low, high, (layer_sizes[i-1], layer_sizes[i])) for i in range(1, len(layer_sizes))])
1413
# Initialize biases for every neuron in all layers
14+
1515
self.biases = np.array([np.random.uniform(low, high, (layer_sizes[i], 1)) for i in range(1, len(layer_sizes))])
1616
# Initialize empty list of output of every neuron in all layers.
17-
self.layer_outputs = [np.zeros((layer_sizes[i], 1)) for i in range(len(layer_sizes))]
17+
self.layer_outputs = np.array([np.zeros((layer_sizes[i], 1)) for i in range(len(layer_sizes))])
1818

1919
self.layer_activations = layer_activations
2020
self.layer_sizes = layer_sizes
2121
self.learning_rate = learning_rate
2222

2323
def calculate_output(self, input_data):
2424
assert len(input_data) == self.layer_sizes[0]
25-
num_calculations = len(self.weights)
2625

2726
y = input_data
2827
self.layer_outputs[0] = y
2928

30-
for i in range(num_calculations):
29+
for i in range(self.weights.shape[0]):
3130
y = self.layer_activations[i](np.dot(self.weights[i].T, y) + self.biases[i], False)
3231
self.layer_outputs[i+1] = y
33-
3432
return y
3533

3634
def train(self, input_data, desired_output_data):
37-
assert len(input_data) == self.layer_sizes[0]
38-
assert len(desired_output_data) == self.layer_sizes[-1]
35+
assert input_data.shape[0] == self.layer_sizes[0]
36+
assert desired_output_data.shape[0] == self.layer_sizes[-1]
3937
self.calculate_output(input_data)
4038

4139
error = (desired_output_data - self.layer_outputs[-1]) * self.layer_activations[-1](self.layer_outputs[-1], True)
4240
self.weights[-1] += (self.learning_rate * self.layer_outputs[-2] * error.T)
4341
self.biases[-1] += self.learning_rate * error
4442

45-
for i in reversed(range(len(self.weights)-1)):
43+
for i in reversed(range(self.weights.shape[0]-1)):
4644
error = np.dot(self.weights[i+1], error) * self.layer_activations[i](self.layer_outputs[i+1], True)
4745
self.weights[i] += (self.learning_rate * self.layer_outputs[i] * error.T)
4846
self.biases[i] += self.learning_rate * error
4947

5048
def calculate_SSE(self, input_data, desired_output_data):
51-
assert len(input_data) == self.layer_sizes[0]
52-
assert len(desired_output_data) == self.layer_sizes[-1]
49+
assert input_data.shape[0] == self.layer_sizes[0]
50+
assert desired_output_data.shape[0] == self.layer_sizes[-1]
5351
return np.sum(np.power(desired_output_data - self.calculate_output(input_data), 2))
5452

53+
def calculate_MSE(self, input_data, output_data):
54+
assert input_data.shape[0] == output_data.shape[0]
55+
size = input_data.shape[0]
56+
sum_error = 0
57+
for i in range(size):
58+
sum_error += self.calculate_SSE(input_data[i], output_data[i])
59+
return sum_error / size
60+
5561
def print_weights_and_biases(self):
5662
print(self.weights)
5763
print(self.biases)
@@ -67,26 +73,28 @@ def print_weights_and_biases(self):
6773
data_output = data_output.reshape((len(data_input), -1, 1))
6874

6975
for i in range(4):
70-
random_seed = np.random.randint(10, 1010)
76+
random_seed = 10
7177
np.random.seed(random_seed)
7278

7379
train_input, validate_input, test_input = h.kfold(4, data_input, random_seed)
7480
train_output, validate_output, test_output = h.kfold(4, data_output, random_seed)
7581

7682
nn = NeuralNetwork(layer_sizes=[10, 15, 7], layer_activations=[h.sigmoid, h.sigmoid])
83+
# test_mse = nn.calculate_MSE(test_input, test_output)
84+
# print("TEST MSE:", test_mse)
7785

7886
previous_mse = 1
7987
current_mse = 0
8088
epochs = 0
8189
begin_time = time.time_ns()
8290
while(current_mse < previous_mse):
8391
epochs += 1
84-
previous_mse = h.calculate_MSE(nn, validate_input, validate_output)
92+
previous_mse = nn.calculate_MSE(validate_input, validate_output)
8593
for i in range(len(train_input)):
8694
nn.train(train_input[i], train_output[i])
87-
current_mse = h.calculate_MSE(nn, validate_input, validate_output)
95+
current_mse = nn.calculate_MSE(validate_input, validate_output)
8896
end_time = time.time_ns()
8997

90-
train_mse = h.calculate_MSE(nn, train_input, train_output)
91-
test_mse = h.calculate_MSE(nn, test_input, test_output)
98+
train_mse = nn.calculate_MSE(train_input, train_output)
99+
test_mse = nn.calculate_MSE(test_input, test_output)
92100
print("Seed:", random_seed, "Epochs:", epochs, "Time:", (end_time-begin_time)/1e9, "Tr:", train_mse, "V:", current_mse, "T:", test_mse)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy