|
|
|
# Classes and methods
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
class Dog:
|
|
|
|
# init method
|
|
|
|
def __init__(self, dogName, dogAge):
|
|
|
|
self.name = dogName
|
|
|
|
self.age = dogAge
|
|
|
|
pass
|
|
|
|
|
|
|
|
def status(self):
|
|
|
|
print("The dog's name is: ", self.name)
|
|
|
|
print("The dog's age is: ", self.age)
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
dog1 = Dog("firulais", 8)
|
|
|
|
dog2 = Dog("Perro", 2)
|
|
|
|
dog3 = Dog("cuadrado", 5)
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
dog3.status()
|
|
|
|
```
|
|
|
|
|
|
|
|
The dog's name is: cuadrado
|
|
|
|
The dog's age is: 5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
# ANN class implementation
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
class Neurona:
|
|
|
|
# init
|
|
|
|
def __init__():
|
|
|
|
pass
|
|
|
|
# feedforward (cálculo)
|
|
|
|
def feedforward():
|
|
|
|
pass
|
|
|
|
# backpropagation (entrenamiento)
|
|
|
|
def backpropagation():
|
|
|
|
pass
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
class Neurona:
|
|
|
|
# init
|
|
|
|
def __init__(self, inputNodes, hiddenNodes, outputNodes):
|
|
|
|
self.inN = inputNodes
|
|
|
|
self.hN = hiddenNodes
|
|
|
|
self.outN = outputNodes
|
|
|
|
##
|
|
|
|
## W = w11 w21
|
|
|
|
self.wih = np.random.rand(self.hN, self.inN)
|
|
|
|
self.who = np.random.rand(self.outN, self.hN)
|
|
|
|
pass
|
|
|
|
# feedforward (cálculo)
|
|
|
|
def feedforward():
|
|
|
|
pass
|
|
|
|
# backpropagation (entrenamiento)
|
|
|
|
def backpropagation():
|
|
|
|
pass
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
inputs = np.array([0.21,0.39, 0.87],ndmin=2).T
|
|
|
|
inputs
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
array([[0.21],
|
|
|
|
[0.39],
|
|
|
|
[0.87]])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
import numpy as np
|
|
|
|
class Neurona:
|
|
|
|
# init
|
|
|
|
def __init__(self, inputNodes, hiddenNodes, outputNodes):
|
|
|
|
self.inN = inputNodes
|
|
|
|
self.hN = hiddenNodes
|
|
|
|
self.outN = outputNodes
|
|
|
|
##
|
|
|
|
## W = w11 w21
|
|
|
|
self.wih = np.random.rand(self.hN, self.inN)-0.5
|
|
|
|
self.who = np.random.rand(self.outN, self.hN)-0.5
|
|
|
|
pass
|
|
|
|
# feedforward (cálculo)
|
|
|
|
def feedforward(self, Inputs):
|
|
|
|
#Xh
|
|
|
|
self.inputs = np.array(Inputs, ndmin=2).T
|
|
|
|
self.Xh = np.dot(self.wih, self.inputs)
|
|
|
|
self.af = lambda x:1/(1+np.exp(-x))
|
|
|
|
#Oh
|
|
|
|
self.Oh = self.af(self.Xh)
|
|
|
|
|
|
|
|
#Xo
|
|
|
|
self.Xo = np.dot(self.who, self.Oh)
|
|
|
|
#Oh
|
|
|
|
self.Oo = self.af(self.Xo)
|
|
|
|
#Oo
|
|
|
|
pass
|
|
|
|
# backpropagation (entrenamiento)
|
|
|
|
def backpropagation(self, Inputs, Targets, Learning):
|
|
|
|
lr = Learning
|
|
|
|
self.inputs = np.array(Inputs, ndmin=2).T
|
|
|
|
self.targets = np.array(Targets, ndmin=2).T
|
|
|
|
#Xh
|
|
|
|
self.Xh = np.dot(self.wih, self.inputs)
|
|
|
|
self.af = lambda x:1/(1+np.exp(-x))
|
|
|
|
#Oh
|
|
|
|
self.Oh = self.af(self.Xh)
|
|
|
|
|
|
|
|
#Xo
|
|
|
|
self.Xo = np.dot(self.who, self.Oh)
|
|
|
|
#Oh
|
|
|
|
self.Oo = self.af(self.Xo)
|
|
|
|
#Oo
|
|
|
|
|
|
|
|
# output error
|
|
|
|
oe = self.targets-self.Oo
|
|
|
|
he = np.dot(self.who.T, oe)
|
|
|
|
self.who=self.who+lr*np.dot(oe*self.Oo*(1-self.Oo), self.Oh.T)
|
|
|
|
self.wih=self.wih+lr*np.dot(he*self.Oh*(1-self.Oh), self.inputs.T)
|
|
|
|
pass
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
mynn = Neurona(3,5,3)
|
|
|
|
mynn.backpropagation([0.21, 0.39, 0.87], [0.12, 0.10, 0.99], 0.3)
|
|
|
|
mynn.who
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
array([[0.89962766, 0.94344371, 0.25520613, 0.50403018, 0.79841922],
|
|
|
|
[0.46742312, 0.8497042 , 0.72150451, 0.4832481 , 0.1614701 ],
|
|
|
|
[0.07348318, 0.74125584, 0.96294501, 0.6829789 , 0.99122929]])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
mynn.backpropagation([0.21, 0.39, 0.87], [0.12, 0.10, 0.99], 0.3)
|
|
|
|
mynn.who
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
array([[0.88622924, 0.92904876, 0.24001207, 0.48936863, 0.78475758],
|
|
|
|
[0.45035738, 0.83136916, 0.70215163, 0.46457349, 0.14406909],
|
|
|
|
[0.07510425, 0.74299748, 0.96478333, 0.68475279, 0.9928822 ]])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Mnist database
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
data_file = open("mnist_train.csv", 'r')
|
|
|
|
data_list = data_file.readlines()
|
|
|
|
data_file.close
|
|
|
|
data_list
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Output ommited due to its length**
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
import numpy as np
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
values = data_list[30600].split(',')
|
|
|
|
image = np.asfarray(values[1:]).reshape((28,28))
|
|
|
|
plt.imshow(image)
|
|
|
|
plt.show()
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
![png](main_files/main_14_0.png)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
values[0]
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
'1'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Training
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
# hyper-parameters:
|
|
|
|
inputNodes = 784
|
|
|
|
hiddenNodes = 100
|
|
|
|
outputNodes = 10
|
|
|
|
learningRate = 0.1
|
|
|
|
myANN = Neurona(inputNodes, hiddenNodes, outputNodes)
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
myANN.wih[:,0]
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
array([ 3.80810137e-01, -2.76021452e-01, 1.89578510e-01, -4.40622523e-01,
|
|
|
|
4.49345620e-04, -2.99576867e-02, 2.88898176e-01, 1.00257001e-01,
|
|
|
|
-1.25427321e-01, -4.10841382e-01, 1.01058830e-01, -4.19682107e-01,
|
|
|
|
-2.61884751e-01, -4.86639132e-01, -4.10475994e-01, 4.72554845e-01,
|
|
|
|
-2.58545906e-01, 2.12843730e-01, 4.77632343e-01, 4.85691685e-01,
|
|
|
|
-2.21585439e-01, 1.43760970e-01, -2.23361202e-01, -3.69871226e-01,
|
|
|
|
-1.21973032e-01, -4.29052035e-01, -3.97413451e-01, 4.65864914e-01,
|
|
|
|
-1.26186271e-01, 2.07401026e-01, 1.05937271e-01, 1.46875776e-01,
|
|
|
|
2.95015245e-01, 3.43457017e-02, -3.29510246e-01, -2.48072947e-01,
|
|
|
|
-3.64935302e-01, 3.09460892e-01, -5.01871329e-02, 2.98023264e-01,
|
|
|
|
-3.19341252e-01, -3.90225500e-02, 3.10060197e-01, -3.13901381e-01,
|
|
|
|
3.69558936e-01, -1.38918625e-01, -4.78037558e-01, 9.24705861e-02,
|
|
|
|
-1.34122723e-01, -8.70299561e-02, -3.93637460e-02, 3.81876093e-01,
|
|
|
|
-8.53474718e-02, -1.29582776e-01, -4.02245397e-01, -4.56054710e-01,
|
|
|
|
2.64854223e-02, -1.53704117e-01, 1.90609293e-01, 3.62048289e-01,
|
|
|
|
-6.25482544e-02, 3.82745274e-01, 1.43009716e-01, 1.75700493e-01,
|
|
|
|
4.09349632e-01, -4.89451563e-01, -9.27621754e-02, 1.41559919e-01,
|
|
|
|
1.34585537e-01, -2.86828229e-01, 3.44307471e-01, -4.98223666e-01,
|
|
|
|
-4.05137857e-01, 1.81890913e-01, -4.57908080e-01, 4.87169160e-01,
|
|
|
|
-2.11761055e-01, 3.18985378e-02, -3.00127711e-01, 4.80807855e-01,
|
|
|
|
-2.70966977e-01, 2.36741392e-02, -3.03853361e-01, -4.29846112e-02,
|
|
|
|
5.33828969e-02, 2.18366071e-01, 2.13736555e-01, -1.15094147e-01,
|
|
|
|
-2.41327435e-02, 3.40917056e-01, 3.76097667e-02, -5.77225150e-03,
|
|
|
|
-3.83882298e-01, -2.31975044e-01, 2.44874629e-01, 7.90940279e-02,
|
|
|
|
-2.92400249e-01, 4.53702317e-01, 8.09984361e-02, -4.93878547e-02])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
epoch = 1
|
|
|
|
for e in range(epoch):
|
|
|
|
for record in data_list:
|
|
|
|
values = record.split(',')
|
|
|
|
inputData = (np.asfarray(values[1:])/255*0.99) +0.01
|
|
|
|
target = np.zeros(outputNodes)+0.01
|
|
|
|
target[int(values[0])] = 0.99
|
|
|
|
myANN.backpropagation(inputData, target, learningRate)
|
|
|
|
pass
|
|
|
|
pass
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
len(data_list)
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49999
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
values = data_list[30600].split(',')
|
|
|
|
inputData = (np.asfarray(values[1:])/255*0.99) +0.01
|
|
|
|
myANN.feedforward(inputData)
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
myANN.Oo
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
array([[2.42193187e-02],
|
|
|
|
[1.11760730e-01],
|
|
|
|
[5.09994337e-01],
|
|
|
|
[4.44172963e-02],
|
|
|
|
[3.37977872e-04],
|
|
|
|
[3.97805262e-03],
|
|
|
|
[1.06099919e-03],
|
|
|
|
[3.15328122e-02],
|
|
|
|
[1.33289159e-01],
|
|
|
|
[2.44129745e-03]])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
|
|
```
|