-
Notifications
You must be signed in to change notification settings - Fork 0
/
digits.py
145 lines (109 loc) · 3.83 KB
/
digits.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
################################################################################
# #
# INTRODUCTION #
# #
################################################################################
# In order to help you with the first assignment, this file provides a general
# outline of your program. You will implement the details of various pieces of
# Python code grouped in functions. Those functions are called within the main
# function, at the end of this source file. Please refer to the lecture slides
# for the background behind this assignment.
# You will submit three python files (sonar.py, cat.py, digits.py) and three
# pickle files (sonar_model.pkl, cat_model.pkl, digits_model.pkl) which contain
# trained models for each tasks.
# Good luck!
################################################################################
# #
# CODE #
# #
################################################################################
import numpy as np
import pickle as pkl
import random
def sigmoid(z):
return
def softmax(u):
return
def cross_entropy_loss(yhat, y):
return
def softmax_cross_entropy_error_back(y, t):
return
def make_one_hot(d):
# return a one-hot vector representation of digit d
return
class Digits_Model:
def __init__(self, dim_input=None, dim_hidden=None, dim_out=None, weights1=None, weights2=None, bias1=None, bias2=None, activation1=(lambda x: x), activation2=(lambda x: x)):
pass
def __str__(self):
'''
display the model's information
'''
info = ""
return info
def __call__(self, x):
'''
return the output of the model for a given input
'''
yhat = None
return yhat
def predict(self, x):
'''
returns a digit
'''
d = None
return d
def load_model(self, file_path):
'''
open the pickle file and update the model's parameters
'''
pass
def save_model(self):
'''
save your model as 'sonar_model.pkl' in the local path
'''
pass
class Digits_Trainer:
def __init__(self, dataset, model):
pass
def accuracy(self, data):
'''
return the accuracy on data given data iterator
'''
acc = None
return acc
def train(self, lr, ne):
'''
This method should:
1. display initial accuracy on the training data loaded in the constructor
2. update parameters of the model instance in a loop for ne epochs using lr learning rate
3. display final accuracy
'''
class Digits_Data:
def __init__(self, relative_path='../../data/assignment1/', data_file_name='digits_data.pkl', batch_size=None):
'''
initialize self.index; load and preprocess data; shuffle the iterator
'''
pass
def __iter__(self):
'''
See example code (ngram) in lecture slides
'''
return self
def __next__(self):
'''
See example code (ngram) in slides
'''
return
def _shuffle(self):
'''
shuffle the data iterator
'''
pass
def main():
data = Sonar_Data()
model = Sonar_Model() # specify the necessary arguments
trainer = Sonar_Trainer(data, model)
trainer.train() # experiment with learning rate and number of epochs
model.save_model()
if __name__ == '__main__':
main()