-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.py
80 lines (66 loc) · 2.55 KB
/
utils.py
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import torch
import numpy as np
# class AdamOptimizer:
# def __init__(self, weights, lr= 1e-3, beta1=0.9, beta2=0.999, epsilon=1e-8):
# self.lr = lr
# self.beta1 = beta1
# self.beta2 = beta2
# self.epsilon = epsilon
# self.m = 0
# self.v = 0
# self.t = 0
# self.theta = weights
# def backward_pass(self, gradient):
# self.t = self.t + 1
# self.m = self.beta1*self.m + (1 - self.beta1)*gradient
# self.v = self.beta2*self.v + (1 - self.beta2)*(gradient**2)
# m_hat = self.m/(1 - self.beta1**self.t)
# v_hat = self.v/(1 - self.beta2**self.t)
# self.theta = self.theta - self.lr*(m_hat/(np.sqrt(v_hat) - self.epsilon))
# return self.theta
class AdamOptimizer:
def __init__(self, weights, lr= 1e-3, beta1=0.9, beta2=0.999, epsilon=1e-8):
self.lr = lr
self.beta1 = beta1
self.beta2 = beta2
self.epsilon = epsilon
self.m = torch.zeros_like(weights)
self.v = torch.zeros_like(weights)
self.t = 0
self.theta = weights
def backward_pass(self, gradient):
self.t = self.t + 1
self.m = self.beta1*self.m + (1 - self.beta1)*gradient
self.v = self.beta2*self.v + (1 - self.beta2)*(gradient**2)
m_hat = self.m/(1 - self.beta1**self.t)
v_hat = self.v/(1 - self.beta2**self.t)
self.theta = self.theta - self.lr*(m_hat/(torch.sqrt(v_hat) + self.epsilon))
return self.theta
class RMSProp:
def __init__(self, weights, lr= 1e-2, decay_rate = 0.99, epsilon=1e-8):
self.lr = lr
self.beta = decay_rate
self.epsilon = epsilon
self.theta = weights
self.v = torch.zeros_like(weights)
def backward_pass(self, gradient):
self.v = self.beta * self.v+ (1-self.beta) * (gradient*gradient)
self.theta = self.theta - self.lr *(gradient/(torch.sqrt(self.v) +self.epsilon ))
return self.theta
class sgd_moment:
def __init__(self, weights, lr= 1e-2, momentum=0.9):
self.lr = lr
self.momentum = momentum
self.theta = weights
self.v = torch.zeros_like(weights)
def backward_pass(self, gradient):
self.v = self.momentum * self.v - self.lr * gradient
self.theta = self.theta + self.v
return self.theta
class sgd:
def __init__(self,weights,lr=1e-2):
self.lr = lr
self.theta = weights
def backward_pass(self,gradient):
self.theta = self.theta - self.lr * gradient
return self.theta