Durante la primera mitad del semestre junto con mi
compañero Adán implementamos una red neuronal que utilizaremos en nuestro
proyecto para reconocer huellas digitales.
Antes que nada, investigué cosas relacionadas con huellas
digitales, sus características y formas en las que se podían representar para
obtener una entrada de datos para la neurona.
A lo largo de este tiempo, estuve leyendo el libro de redes neuronales que nos recomendó la maestra, con esto y las presentaciones de la maestra logré entender como funciona una red neuronal.
A lo largo de este tiempo, estuve leyendo el libro de redes neuronales que nos recomendó la maestra, con esto y las presentaciones de la maestra logré entender como funciona una red neuronal.
Empecé con el desarrollo de la neurona en algunas clases,
con ayuda de mi compañero realizamos lo principal que era la entrada de datos y
la sumatoria de las entradas con sus pesos correspondientes para después
compararla con el umbral y obtener una salida. Después de que mi compañero
finalizó esto, yo me encargue de implementar la tasa de aprendizaje para la
neurona, para esto se le pedía al usuario la salida esperada, la cual se
utiliza después para compararla con la salida obtenida en la función de
activación y si estas son diferentes se realiza una modificación en los pesos.
Implementé la ecuación con la tasa de aprendizaje para modificar la línea de
separación de las clases.
Esta implementado para que se modifique este vector las
veces que sea necesario para que pueda separar las clases adecuadamente. Al
final tiene un contador que te dice cuantas veces falló y se tuvieron que
modificar los pesos.
En la parte de la presentación grupal aporté algunas
ideas así como también realicé el diagrama de arquitectura de la red neuronal.
También estuve realizando pruebas para mostrar el resultado de la neurona
gráficamente, pero tuve unos pequeños problemas que solucionaré para mostrarlo
en la siguiente entrega. También estoy investigando sobre la red multicapa y el
uso de más neuronas en nuestra red, actualmente estoy tratando de acoplar las entradas
de datos binarios que se generaron de las imágenes que se encuentran en la base
de datos para poder obtener una resultado real.
Código.
Version 2. http://www.mediafire.com/?25edyd5tdznr38p
Version 4. http://www.mediafire.com/?sduxz5qa7myqda7
Código.
#!/usr/bin/python
import random
x=[]
w=[] #pesos
wn=[] #pesos nuevos
wi=[] #pesos nuevos insertados
alpha = 0.05
umbral = 0.5
t = 0
p = 0
res = 0
res2 = 0
suma = 0
mult = 0
i = 1
countErr=0
def inicio():
global n
n = input("Dame el numero de entradas ")
for i in range(n):
x.insert(i,random.uniform(0,2)) #generar cadena de entradas binarias aleatorias
w.insert(i,random.uniform(-1.0,1.0)) #generar cadenas de pesos random
x.append(-1) #agregar al vector de entradas un -1 al final
print '\nVector de elementos de entrada generado \n', x[:]
w.append(umbral) #agregar al vector de pesos el umbral al final
print '\nVector de elementos de pesos generado \n', w[:]
sumatoria() #brincar a la funcion sumatoria
return n
def sumatoria():
global suma
suma=0
res=0
res = x[i] * w[i] #sumatoria del producto de elementos de entrada por elmentos del peso
suma = suma + res #actualizar sumatoria
#t = raw_input("\nSalida Esperada (0 o 1): ") #pedir al usuario salida esperada
t = random.randint(0,1) #generar solucion esperada aleatoria entre 0 y 1
#t = int(t)
print '\nLa salida aleatoria deseada es \n', t
print '\nLa sumatoria de productos de entradas por pesos es:', suma #imprimir la sumatoria total del producto de entradas por pesos
comparacion(t,n) #brincar a la funcion comparacion
return t
def comparacion(t,n):
global countErr
if(suma>=umbral): #comparar suma con el umbral
p=1 #suma mayor o igual a 1, salida obtenida = 1
print '\nLa salida obtenida = 1'
else:
p=0 #de lo contrario, salida obtenida = 0
print '\nLa salida obtenida = 0'
i=1
if(t!=p): #si la salida esperada difiere de la salida producida, se realiza un cambio en el vector de pesos
countErr +=1
wn[:]=[]
for i in range(n+1):
mult = alpha*(t-p)*x[i] #agregamos la tasa de aprendizaje alpha para modificar los pesos
wi.insert(i,w[i] + mult)
wn.insert(i,wi[i]) #agregamos a un vector nuevo los nuevos pesos
wn.append(umbral) #agregamos el umbral al final del vector de pesos nuevo
w[:]=[]
for i in range(n+1):
w.insert(i,wn[i])
print '\nVector de elementos de pesos nuevos generado es \n', wn[:] #imprimimos el vector nuevo de pesos
sumatoria() #brincamos a la funcion sumatoria para volver a hacer calculas
else:
print 'La salida esperada fue diferente que la obtenida', countErr, 'veces'
return countErr, w[:]
def main():
global x,n,w,wn,wi,umbral
inicio()
main()
Version 2. http://www.mediafire.com/?25edyd5tdznr38p
Version 4. http://www.mediafire.com/?sduxz5qa7myqda7
Version 2.
Version 4.
Presentación.
Compañeros de equipo.
Daniel Martínez: Link a blog
Sergio Hernández: Link a blog
Adán Cuellar: Link a blog


El reporte es algo breve y la funcionalidad implementada en el código es muy básica. No hay evidencia de uso de control de versiones. Van 7 y 7.
ResponderEliminar