-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathneuralNetwork.py
More file actions
257 lines (183 loc) · 6.88 KB
/
Copy pathneuralNetwork.py
File metadata and controls
257 lines (183 loc) · 6.88 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
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# -*- coding: utf-8 -*-
"""Project1_NN.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1qAwx37wQCzLTEBfJ61ZqWo-aQ6f6Oigr
CARLOS MATEO MUÑOZ ECE 566
## Load packages
"""
import numpy as np
import matplotlib.pyplot as plt
from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
"""## Define functions
### Sigmoid
"""
def sigmoid(z):
"""
Compute the sigmoid of z
Arguments:
z -- A scalar or numpy array of any size.
Return:
s -- sigmoid(z)
"""
s = 1.0/(1 + np.exp(-z))
return s
"""### Initialize weights"""
def initialize_weights(dim):
"""
This function creates a vector of zeros of shape (dim, 1) for w and initializes b to 0.
Argument:
dim -- size of the w vector we want (or number of parameters in this case)
Returns:
w -- initialized vector of shape (dim, 1)
b -- initialized scalar (corresponds to the bias)
"""
w = np.zeros((dim,1))
b = 0
assert(w.shape == (dim, 1))
assert(isinstance(b, float) or isinstance(b, int))
return w, b
"""### Forward and backward propagation"""
def propagate(w, b, X, Y):
"""
Implement the cost function and its gradient for the propagation explained in the assignment
Arguments:
w -- weights, a numpy array of size (num_px * num_px, 1)
b -- bias, a scalar
X -- data of size (number of examples, num_px * num_px)
Y -- true "label" vector of size (1, number of examples)
Return:
cost -- negative log-likelihood cost for logistic regression
dw -- gradient of the loss with respect to w, thus same shape as w
db -- gradient of the loss with respect to b, thus same shape as b
"""
m = X.shape[0]
Y = np.matrix(Y)
# FORWARD PROPAGATION (FROM X TO COST)
z = np.dot(X, w) + b
y_hat = sigmoid(z)
L = (-Y*np.log(1E-15+y_hat)-(1-Y)*np.log(1-y_hat+1E-15)).T
cost = L.sum() / m
# BACKWARD PROPAGATION (TO FIND GRAD)
error = y_hat -Y.T
dw = np.dot(X.T, error)/m
db = (error)/m
assert(dw.shape == w.shape)
assert(db.dtype == float)
cost.squeeze()
assert(cost.shape == ())
grads = {"dw": dw,
"db": db}
return grads, cost
"""### Gradient descent"""
def gradient_descent(w, b, X, Y, num_iterations, learning_rate):
"""
This function optimizes w and b by running a gradient descent algorithm
Arguments:
w -- weights, a numpy array of size (num_px * num_px, 1)
b -- bias, a scalar
X -- data of shape (num_px * num_px, number of examples)
Y -- true "label" vector of shape (1, number of examples)
num_iterations -- number of iterations of the optimization loop
learning_rate -- learning rate of the gradient descent update rule
Returns:
params -- dictionary containing the weights w and bias b
grads -- dictionary containing the gradients of the weights and bias with respect to the cost function
costs -- list of all the costs computed during the optimization, this will be used to plot the learning curve.
Tips:
You basically need to write down two steps and iterate through them:
1) Calculate the cost and the gradient for the current parameters. Use propagate().
2) Update the parameters using gradient descent rule for w and b.
"""
costs = []
for i in range(num_iterations):
# Cost and gradient calculation
grads, cost = propagate(w, b, X, Y)
# Retrieve derivatives from grads
dw = grads["dw"]
db = grads["db"]
# update rule
w -= learning_rate*dw
b -= learning_rate*db
# Record the costs
if i % 100 == 0:
costs.append(cost)
# Print the cost every 100 training examples
print ("Cost after iteration %i: %f" % (i, cost))
params = {"w": w,
"b": b}
grads = {"dw": dw,
"db": db}
return params, grads, costs
"""### Make predictions"""
def predict(w, b, X):
'''
Predict whether the label is 0 or 1 using learned logistic regression parameters (w, b)
Arguments:
w -- weights, a numpy array of size (num_px * num_px, 1)
b -- bias, a scalar
X -- data of size (num_px * num_px, number of examples)
Returns:
Y_prediction -- a numpy array (vector) containing all predictions (0/1) for the examples in X
'''
m = X.shape[0]
Y_prediction = np.zeros((1, m))
w = w.reshape(X.shape[1], 1)
# Compute vector "A" predicting the probabilities of the picture containing a 1
A = sigmoid(np.dot(w.T, X.T))
for i in range(A.shape[1]):
# Convert probabilities A[0,i] to actual predictions p[0,i]
if (A[0,i] > 0.5):
Y_prediction[0,i] = 1
else:
Y_prediction[0,i] = 0
assert(Y_prediction.shape == (1, m))
return Y_prediction
"""## Merge functions and run your model"""
# LOAD DATA
class0 = 5
class1 = 6
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train[np.isin(y_train,[class0,class1]),:,:]
y_train = 1*(y_train[np.isin(y_train,[class0,class1])]>class0)
x_test = x_test[np.isin(y_test,[class0,class1]),:,:]
y_test = 1*(y_test[np.isin(y_test,[class0,class1])]>class0)
# RESHAPE
x_train_flat = x_train.reshape(x_train.shape[0],-1)
print(x_train_flat.shape)
print('Train: '+str(x_train_flat.shape[0])+' images and '+str(x_train_flat.shape[1])+' neurons \n')
x_test_flat = x_test.reshape(x_test.shape[0],-1)
print(x_test_flat.shape)
print('Test: '+str(x_test_flat.shape[0])+' images and '+str(x_test_flat.shape[1])+' neurons \n')
# STRANDARIZE
x_train_flat = x_train_flat / 255
x_test_flat = x_test_flat / 255
"""### Train the model (in training set)"""
# Initialize parameters with zeros (≈ 1 line of code)
w, b = initialize_weights(x_train_flat.shape[1])
# Gradient descent (≈ 1 line of code)
learning_rate = 0.5
num_iterations = 101
parameters, grads, costs = gradient_descent(w, b, x_train_flat, y_train, num_iterations, learning_rate)
"""### Test the model (in testing set)"""
# Retrieve parameters w and b from dictionary "parameters"
w = parameters["w"]
b = parameters["b"]
# Predict test/train set examples (≈ 2 lines of code)
y_prediction_test = predict(w, b, x_test_flat)
y_prediction_train = predict(w, b, x_train_flat)
# Print train/test Errors
print('')
print("train accuracy: {} %".format(100 - np.mean(np.abs(y_prediction_train - y_train)) * 100))
print("test accuracy: {} %".format(100 - np.mean(np.abs(y_prediction_test - y_test)) * 100))
print('')
plt.figure(figsize=(13,5))
plt.plot(range(0,num_iterations,100),costs)
plt.title('Cost training vs iteration')
plt.xlabel('Iterations')
plt.ylabel('Cost')
plt.xticks(range(0,num_iterations,100))
plt.figure(figsize=(13,5))
plt.imshow(w.reshape(28,28))
plt.title('Template')