|
| 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