You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.9 KiB
97 lines
2.9 KiB
## Machine Learning Online Class - Exercise 3 | Part 2: Neural Networks
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
import scipy, scipy.io, scipy.optimize
|
|
from ex3.ex3_ import displaydata, sigmoid
|
|
|
|
|
|
# PREDICT Predict the label of an input given a trained neural network
|
|
# p = PREDICT(Theta1, Theta2, X) outputs the predicted label of X given the
|
|
# trained weights of a neural network (Theta1, Theta2)
|
|
def predict(Theta1, Theta2, X):
|
|
# Useful values
|
|
m = X.shape[0]
|
|
num_labels = Theta2.shape[0]
|
|
|
|
# Add ones to the X data matrix
|
|
X = np.hstack((np.ones((m, 1)), X))
|
|
|
|
# First hidden layer
|
|
temp = sigmoid(X.dot(Theta1.T))
|
|
m2 = temp.shape[0]
|
|
|
|
# Add ones to hidden layer units
|
|
temp = np.hstack((np.ones((m2, 1)), temp))
|
|
|
|
# Output layer
|
|
temp = sigmoid(temp.dot(Theta2.T))
|
|
|
|
p = temp.argmax(axis=1) + 1
|
|
return p
|
|
|
|
|
|
|
|
## ===================== Start Main ======================
|
|
if __name__ == "__main__":
|
|
## Setup the parameters you will use for this exercise
|
|
input_layer_size = 400 # 20x20 Input Images of Digits
|
|
hidden_layer_size = 25 # 25 hidden units
|
|
num_labels = 10 # 10 labels, from 1 to 10
|
|
|
|
## =========== Part 1: Loading and Visualizing Data =============
|
|
# Load Training Data
|
|
print('Loading and Visualizing Data ...\n')
|
|
|
|
data = scipy.io.loadmat('mat/ex3data1.mat', matlab_compatible=True) # training data stored in arrays X, y
|
|
X = data['X']
|
|
y = data['y']
|
|
m = X.shape[0]
|
|
|
|
# Randomly select 100 data points to display
|
|
sel = np.random.permutation(m)
|
|
sel = X[sel[:100], :]
|
|
|
|
displaydata(sel)
|
|
plt.show()
|
|
|
|
print('Program paused. Press enter to continue.\n')
|
|
input()
|
|
|
|
## ================ Part 2: Loading Pameters ================
|
|
print('\nLoading Saved Neural Network Parameters ...\n')
|
|
|
|
# Load the weights into variables Theta1 and Theta2
|
|
data = scipy.io.loadmat('mat/ex3weights.mat', matlab_compatible=True)
|
|
Theta1 = data['Theta1']
|
|
Theta2 = data['Theta2']
|
|
|
|
|
|
## ================= Part 3: Implement Predict =================
|
|
pred = predict(Theta1, Theta2, X)
|
|
|
|
print('\nTraining Set Accuracy: {0:f}\n'.format(np.mean(pred == y.flatten()) * 100))
|
|
|
|
print('Program paused. Press enter to continue.\n')
|
|
input()
|
|
|
|
# To give you an idea of the network's output, you can also run
|
|
# through the examples one at the a time to see what it is predicting.
|
|
|
|
# Randomly permute examples
|
|
rp = np.random.permutation(m)
|
|
|
|
for i in range(0, m):
|
|
ind = rp[i] # Chosen index in X
|
|
|
|
# Display
|
|
print('\nDisplaying Example Image\n')
|
|
displaydata(X[ind:ind+1, :])
|
|
plt.pause(0.0001)
|
|
plt.show(block=False)
|
|
|
|
pred = predict(Theta1, Theta2, X[ind:ind+1,:])
|
|
print('\nNeural Network Prediction: {0:d} (digit {1:d})\n'.format(pred[0], np.mod(pred, 10)[0]))
|
|
|
|
# Pause
|
|
print('Program paused. Press enter to continue.\n')
|
|
input()
|
|
|