-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmodel_np.py
100 lines (76 loc) · 3.09 KB
/
model_np.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import numpy as np
import logging
from tqdm import *
class LinearModel(object):
def __init__(self, shape, optimizer='seq', lr=0.01, clip_min=0, clip_max=1081, is_round=True):
'''
param shape: phi_x shape
'''
self.optimizer = optimizer
self.lr = lr
self.shape = shape
self.learning_rate_decay = 0.99
# w is Mx1 column vector
self.w = np.asmatrix(self._init_weight(shape + (1,)))
# Setup model
self._setup_model()
# Setup optimizer (vary from models)
self._setup_optimizer()
def get_weight(self, sess):
return self.w
def set_weight(self, sess, w):
self.w = w
def save(sess):
self.w_save = self.get_weight(sess)
def save_to_file(self, sess, filename):
np.save(filename, self.get_weight(sess))
def load(sess):
self.set_weight(sess, self.w_save)
def load_from_file(self, sess, filename):
w = np.load(filename)
self.set_weight(sess, w)
def fit(self, sess, x_, t_, epoch=10, batch_size=1):
lr = self.lr
if self.optimizer == 'seq':
batch_indices = range(len(x_))
for epoch in xrange(epoch):
np.random.shuffle(batch_indices)
for i in tqdm(range(0, len(x_), batch_size)):
i_ = min(i + batch_size, len(x_))
self._optimize(sess, x_[batch_indices[i:i_]], t_[batch_indices[i:i_]], lr=lr)
loss = self.eval(sess, x_, t_)
if epoch % 1 == 0:
logging.info('Epoch %d: training loss = %f (lr = %f)' % (epoch, loss, lr))
lr = lr * self.learning_rate_decay
else:
self._optimize(sess, x_, t_)
def eval(self, sess, x_, t_):
return np.sum(np.asarray(t_ - self.test(sess, x_))**2) / (2 * len(x_))
def test(self, sess, x_):
return np.asmatrix(x_) * self.w
def reset(self, sess):
self.set_weight(sess, np.asmatrix(self._init_weight(self.shape + (1,))))
def _init_weight(self, shape):
return np.zeros(shape)
def _setup_model(self):
'''
Linear model doesn't need extra setup
'''
def _setup_optimizer(self):
'''
Numpy do not need
'''
def _optimize(self, sess, x_, t_, lr=None):
if lr == None:
lr = self.lr
self.w = self.w - lr * x_.T * (self.test(sess, x_) - t_) / (2 * len(x_))
class RidgeLinearModel(LinearModel):
def __init__(self, shape, optimizer='seq', alpha=0.01, mean=0.0, var=0.8, lr=0.01, clip_min=0, clip_max=1081, is_round=True):
self.alpha = alpha
self.mean = mean
self.var = var
super(RidgeLinearModel, self).__init__(shape, optimizer, lr, clip_min, clip_max, is_round)
def _optimize(self, sess, x_, t_, lr=None):
if lr == None:
lr = self.lr
self.w = self.w - lr * (x_.T * (self.test(sess, x_) - t_) / (2 * len(x_))) - self.alpha * np.sum(self.w) / (2 * len(x_))