-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoptimizer.py
More file actions
40 lines (28 loc) · 1.22 KB
/
Copy pathoptimizer.py
File metadata and controls
40 lines (28 loc) · 1.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
class Optimizer:
def __init__(self, model, learning_rate=0.01):
self.model = model
self.learning_rate = learning_rate
def loss(self, xs, ys): # MSE loss
total_loss = 0
for x, y in zip(xs, ys):
prediction = self.model.forward(x)
total_loss += self.model.calculate_loss(prediction, y)
return total_loss / len(xs)
def calculate_grads(self, xs, ys):
total_grads = [np.zeros_like(layer) for layer in self.model.layers]
for x, y in zip(xs, ys):
sample_grads = self.model.backward(x, y)
for layer_index in range(len(total_grads)):
total_grads[layer_index] += sample_grads[layer_index]
for layer_index in range(len(total_grads)):
total_grads[layer_index] /= len(xs)
return total_grads
def update_params(self, layer_grads):
for layer_index in range(len(self.model.layers)):
self.model.layers[layer_index] -= self.learning_rate * layer_grads[layer_index]
def step(self, xs, ys):
starting_loss = self.loss(xs, ys)
layer_grads = self.calculate_grads(xs, ys)
self.update_params(layer_grads)
return starting_loss