Skip to content

Commit 96cd005

Browse files
authored
Create perceptron.py
1 parent 9ca0fd8 commit 96cd005

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed

perceptron.py

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
#-------------------------------------------------------------------------------
2+
# Name: perceptron.py
3+
#
4+
# Author: inigo ozcoidi (oscoidi)
5+
#
6+
# Created: 6/11/2017
7+
#-------------------------------------------------------------------------------
8+
9+
import math,random,os
10+
11+
class Perceptron():
12+
13+
def __init__(self):
14+
self.alpha = 0.6 #factor de aprendizaje. Cuanto mayor es antes aprende pero tiene menor precision
15+
self.perceptron = [] # array que nos define el perceptron y por cada capa contiene un subarray de la siguiente forma: [numero neurons de la capa,[umbrales de actuacion(u)],[pesos(w)],[salidas de las neuronas(a)]]
16+
self.ntrain = 0 #numero de entrenamientos ejecutados
17+
os.chdir('/home/python/Desktop/Perceptron') #cambiamos el directorio de trabajo(debereis cambiarlo por la direccion donde guardeis el programa)
18+
self.cwd = os.getcwd()
19+
self.saveurl = self.cwd + '/perceptron.txt' #url donde guardaremos la red neuronal una vez entrenada
20+
self.trainingdata = self.cwd + '/entrenamientoperc.txt' #url donde tenemos la training data
21+
self.build() #construimos la red neuronal
22+
self.train() #entrenamos la red neuronal
23+
while True: #utilizamos la red neuronal
24+
for i in range(self.perceptron[0][0]):
25+
self.perceptron[0][3][i] = input('entrada ' + str(i) + ' : ')
26+
self.percep()
27+
28+
def build(self): #funcion que construye la red neuronal
29+
print('***PERCEPTRON***')
30+
for i in range(input('numero de capas: ')):
31+
capa = []
32+
u = []
33+
w = []
34+
a = []
35+
capa.append(input('numero de neuronas en la capa ' + str(i) + ' : '))#anadimos el numero de neuronas de la capa
36+
for j in range(capa[0]):
37+
u.append(random.random()) #creamos umbrales de actuacion aleatorios
38+
a.append(random.random()) #creamos salidas aleatorias
39+
wc = []
40+
if i != 0:
41+
for k in range(self.perceptron[i-1][0]):
42+
wc.append(random.random()) #creamos pesos aleatorios
43+
w.append(wc)
44+
capa.append(u)
45+
capa.append(w)
46+
capa.append(a)
47+
self.perceptron.append(capa) #añadimos la capa a la red neuronal
48+
49+
def percep(self):#funcion que calcula la salida de la red neuronal ante una serie de entradas
50+
print('salida de las neuronas capa 0:')
51+
print(self.perceptron[0][3])
52+
for k in range(len(self.perceptron)-1):
53+
for i in range(self.perceptron[k+1][0]):
54+
suma = 0
55+
for j in range(self.perceptron[k][0]):
56+
suma = suma + (self.perceptron[k][3][j] * self.perceptron[k+1][2][i][j])
57+
suma = suma + self.perceptron[k+1][1][i]
58+
suma = (1/( 1 + math.exp(-suma)))
59+
self.perceptron[k+1][3][i] = suma
60+
print('salida de las neuronas capa ' + str(k+1) + ' : ')
61+
print(self.perceptron[k+1][3])
62+
63+
def train(self): #funcion que inicia el entrenamiento
64+
print('-+-Comienza el entrenamiento del perceptron-+-')
65+
for r in range(input('numero de veces que quiere repetir el entrenamiento: ')):
66+
self.readlines()
67+
self.save()
68+
69+
def readlines(self): #lee la training data y llama a las funciones percep y backpropagation
70+
entrenamiento = open(self.trainingdata,'r') #abrimos el archivo
71+
lineas = entrenamiento.readlines()
72+
entrenamiento.close()
73+
for i in range(len(lineas)):#leemos linea a linea
74+
self.ntrain += 1
75+
print('***entrenamiento numero ' + str(self.ntrain) + ' ***')
76+
linea = lineas[i]
77+
boolean = False
78+
numero = ''
79+
k = 0
80+
se = []
81+
for x in range(self.perceptron[len(self.perceptron)-1][0]):
82+
se.append(0)
83+
for j in range(len(linea)):
84+
if linea[j]==']' and boolean:
85+
se[k] = numero
86+
numero = ''
87+
k = 0
88+
if linea[j]==']' and boolean == False:
89+
boolean = True
90+
self.perceptron[0][3][k] = float(numero)
91+
numero = ''
92+
k = 0
93+
if linea[j] != ',' and linea[j] != '[' and linea[j] != ']':
94+
numero = numero + linea[j]
95+
if linea[j] == ',' and boolean == False:
96+
self.perceptron[0][3][k] = float(numero)
97+
numero = ''
98+
k += 1
99+
if linea[j] == ',' and boolean:
100+
se[k] = float(numero)
101+
numero = ''
102+
k += 1
103+
se[self.perceptron[len(self.perceptron)-1][0]-1] = float(se[self.perceptron[len(self.perceptron)-1][0]-1])
104+
print('entrada: ' + str(self.perceptron[0][3]) + ' salida esperada: ' + str(se))
105+
self.percep() #calculamos las salidas que nos daria las entradas de la training data
106+
self.backpropagation(se) #calculamos los errores entre la salida esperada y la obtenida y realizamos las correciones oportunas.
107+
108+
def backpropagation(self,se):
109+
#calculamos los erroes y realizamos las correcciones oportunas
110+
#empezamos por la ultima capa de neuronas
111+
deltam = []
112+
for k in range(self.perceptron[len(self.perceptron)-1][0]):
113+
deltam.append(self.perceptron[len(self.perceptron)-1][3][k]*(1 - self.perceptron[len(self.perceptron)-1][3][k]) * (self.perceptron[len(self.perceptron)-1][3][k] - se[k]))
114+
for n in range(self.perceptron[len(self.perceptron)-2][0]):
115+
self.perceptron[len(self.perceptron)-1][2][k][n] = self.perceptron[len(self.perceptron)-1][2][k][n] - self.alpha * deltam[k] * self.perceptron[len(self.perceptron)-2][3][n]
116+
self.perceptron[len(self.perceptron)-1][1][k] = self.perceptron[len(self.perceptron)-1][1][k] - self.alpha * deltam[k]
117+
#seguimos con las capas ocultas de neuronas
118+
for x in range(len(self.perceptron)-2):
119+
deltal = []
120+
sumatorio2 = 0
121+
for k in range(self.perceptron[len(self.perceptron)-2-x][0]):
122+
for c in range(self.perceptron[len(self.perceptron)-3-x][0]):
123+
for s in range(self.perceptron[len(self.perceptron)-1-x][0]):
124+
sumatorio2 = sumatorio2 + deltam[s] * self.perceptron[len(self.perceptron)-1-x][2][s][k]
125+
deltal.append((self.perceptron[len(self.perceptron)-2-x][3][k] * (1 - self.perceptron[len(self.perceptron)-2-x][3][k])) * sumatorio2)
126+
for n in range(self.perceptron[len(self.perceptron)-3-x][0]):
127+
self.perceptron[len(self.perceptron)-2-x][2][k][n] = self.perceptron[len(self.perceptron)-2-x][2][k][n] - self.alpha * deltal[k] * self.perceptron[len(self.perceptron)-3-x][3][n]
128+
self.perceptron[len(self.perceptron)-2-x][1][k] = self.perceptron[len(self.perceptron)-2-x][1][k] - self.alpha * deltal[k]
129+
deltam = deltal
130+
def save(self):
131+
#ahora guardamos nuestro perceptron para que el entrenamiento quede guardado
132+
print('entrenamiento finalizado...guardamos los resultados')
133+
entrenamiento = open(self.saveurl,'w')
134+
entrenamiento.write(str(self.perceptron))
135+
entrenamiento.close
136+

0 commit comments

Comments
 (0)