I need some help for a project I am working on for a data science course. In this project I classy the digits of the MNIST datasets in three ways:
The first two parts are done, but I getting an error for the neural network code that I can't solve. This is the code.
#Upload the MNIST dataset
data = load('mnist.npz')
x_train = data['arr_0']
y_train = data['arr_1']
x_test = data['arr_2']
y_test = data['arr_3']
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
The output is
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
Then,
#Setting up the neural network and defining sigmoid function
#self.mtrx holds the neurons in each level
#self.weight, bias, grad hold weight, bias and gradient values between level L and L - 1
class NeuralNetwork:
def __init__(self, rows, columns=0):
self.mtrx = np.zeros((rows, 1))
self.weight = np.random.random((rows, columns)) / columns ** .5
self.bias = np.random.random((rows, 1)) * -1.0
self.grad = np.zeros((rows, columns))
def sigmoid(self):
return 1 / (1 + np.exp(-self.mtrx))
def sigmoid_derivative(self):
return self.sigmoid() * (1.0 - self.sigmoid())
#Initializing neural network levels
lvl_input = NeuralNetwork(784)
lvl_one = NeuralNetwork(200, 784)
lvl_two = NeuralNetwork(200, 200)
lvl_output = NeuralNetwork(10, 200)
#Forward and backward propagation functions
def forward_prop():
lvl_one.mtrx = lvl_one.weight.dot(lvl_input.mtrx) + lvl_one.bias
lvl_two.mtrx = lvl_two.weight.dot(lvl_one.sigmoid()) + lvl_two.bias
lvl_output.mtrx = lvl_output.weight.dot(lvl_two.sigmoid()) + lvl_output.bias
def back_prop(actual):
val = np.zeros((10, 1))
val[actual] = 1
delta_3 = (lvl_output.sigmoid() - val) * lvl_output.sigmoid_derivative()
delta_2 = np.dot(lvl_output.weight.transpose(), delta_3) * lvl_two.sigmoid_derivative()
delta_1 = np.dot(lvl_two.weight.transpose(), delta_2) * lvl_one.sigmoid_derivative()
lvl_output.grad = lvl_two.sigmoid().transpose() * delta_3
lvl_two.grad = lvl_one.sigmoid().transpose() * delta_2
lvl_one.grad = lvl_input.sigmoid().transpose() * delta_1
#Storing mnist data into np.array
def make_image(c):
lvl_input.mtrx = x_train[c]
#Evaluating cost function
def cost(actual):
val = np.zeros((10, 1))
val[actual] = 1
cost_val = (lvl_output.sigmoid() - val) ** 2
return np.sum(cost_val)
#Subtraction gradients from weights and initializing learning rate
learning_rate = .01
def update():
lvl_output.weight -= learning_rate * lvl_output.grad
lvl_two.weight -= learning_rate * lvl_two.grad
lvl_one.weight -= learning_rate * lvl_one.grad
And finally I train the neural network.
#Training neural network
#iter_1 equals number of batches
#iter_2 equals number of iterations in one batch
iter_1 = 50
iter_2 = 100
for batch_num in range(iter_1):
update()
counter=0
for batches in range(iter_2):
make_image(counter)
num = np.argmax(y_train[counter])
counter += 1
forward_prop()
back_prop(num)
print("actual: ", num, " guess: ", np.argmax(lvl_output.mtrx), " cost", cost(num))
I get the following error and I can't figure out what's wrong with my code.. can anybody help?
ValueError Traceback (most recent call last)
<ipython-input-12-8821054ddd29> in <module>
13 num = np.argmax(y_train[counter])
14 counter += 1
---> 15 forward_prop()
16 back_prop(num)
17 print("actual: ", num, " guess: ", np.argmax(lvl_output.mtrx), " cost", cost(num))
<ipython-input-6-e6875bcd1a03> in forward_prop()
2
3 def forward_prop():
----> 4 lvl_one.mtrx = lvl_one.weight.dot(lvl_input.mtrx) + lvl_one.bias
5 lvl_two.mtrx = lvl_two.weight.dot(lvl_one.sigmoid()) + lvl_two.bias
6 lvl_output.mtrx = lvl_output.weight.dot(lvl_two.sigmoid()) + lvl_output.bias
ValueError: shapes (200,784) and (28,28) not aligned: 784 (dim 1) != 28 (dim 0)
In your code:
def make_image(c):
lvl_input.mtrx = x_train[c]
althout you init lvl_input.mtrx
with shape (row, 1), data with shape(28,28) then assign to lvl_input.mtrx
later. Basically reshape()
need to be done to training data