Diseños de neuronas electronicas

Estoy asistiendo a un curso de redes neuronales (matemática, nada de hardware) y el primer ejercicio es hacer funcionar un perceptrón simple (sin capas ocultas) para hacer un OCR (Reconocedor Optico de Caracteres).
Es un tipo de red neuronal que se dice asistida, porque se debe entrenar con relaciones de entrada-salida conocidas.
Les paso el enunciado (en el TP1_2014.pdf) y una implementación mía en Matlab (en el PCO1-c.zip) para un entrenamiento con 5 letras (A,B,C,D,E) y un conjunto de pruebas de 5 letras (las mismas pero con ruido).
Cada letra se arma con un arreglo de 5 pixels de ancho por otros 5 de alto, que se leen desde un archivo "dataset.m". Los arreglos se completan con un -1 al final para considerar los umbrales de activación de la red.
El entrenamiento consiste en calcular los factores de peso para cada entrada.
La neurona se entrena ejecutando con Matlab el script "ps_ent.m", rutina que, en cada pasada (o época):
1.- calcula los factores de peso para todas las muestras,
2.- calcula el error para todas las muestras,
3.- corrige los factores de peso para reducir el error total.
Esto lo repite hasta que el error de cada pasada sea menor que un determinado valor.
El programa pide entrar un coeficiente "llamado velocidad de aprendizaje", lo que permite ajustar algo la precisión y la cantidad de pasadas que se calculan.
Como en mi caso los "pesos" iniciales son al azar, cada vez se obtiene una solución diferente.
Al entrenar construye los bmp de cada letra, muestra la curva de aprendizaje (el error en función de las pasadas),
curva de aprendizaje.jpg
y el mapa de pesos en colores.
mapa de pesos.jpg
En una segunda etapa, para usar la red se ejecuta el el script "ps_uso.m".
El programa pide entrar el numero de ejemplo a probar con la red y el resultado es un nro binario de 10 bits escrito de atrás para adelante. Con las primeras 5 muestras no debería fallar, y con las 5 finales debería dar diferente según cuanto ruido uno le agrege a las muestras. Yo le puse dos o tres pixels cambiados.
dataset grafico.jpg
No es nada del otro mundo, pero está bueno para empezar a experimentar y perderle el miedo al tema. Luego uno lo puede complicar todo lo que quiera.
El paso siguiente es poner algo como esto en una FPGA, y ya tenemos un pequeño cerebro electrónico, al menos para hacer cosas simples como reconocer caracteres.
No es chiste, creo que esto sería más simple que construir como alguien dijo antes una madeja de FPGAs que se auto configuren.
 

Adjuntos

  • PCO1-c.zip
    3.7 KB · Visitas: 4
  • TP1_2014.pdf
    91.2 KB · Visitas: 4
Última edición:
Acá les muestro un programa que hice para clasificar un conjunto de tapitas exclusivamente a partir de su color.
La aplicación en sí no sé si es muy práctica pero sirve para ilustrar las posibilidades de la técnica.
El video muestra cómo se entrena una red neuronal denominada Mapa Auto Organizado de Cohonen.
Para el entenamiento se utiliza un archivo con 2970 ternas RGB. Estos números son generados al azar a partir de 9 colores bien diferentes de componentes RGB: (0,0,0), (0,0,255), ..., (255,255,255) y (127,127,127).
En total se emplean 330 variantes al azar de cada uno de los 9 colores base.
En un caso real el conjunto de colores de entrenamiento se podría generar fotografiando cada tapita por separado o más eficientemente digitalizando una foto del conjunto de tapitas a clasificar.
Una vez entrenada la red cada tapita se explora individualmente con una cámara y su terna RGB se analiza con la red neuronal.
El programa ubica el color correspondiente en una región de la pantalla que agrupa los colores similares.
En el caso de aplicar esto a un clasificador de tapitas, deberá además habilitar una compuerta diferente para que la tapita sea reunida en una bolsa diferente para cada color.
Entiendo que la aplicación práctica sería más interesante de ver, pero por ahora sólo terminé el software. El enlace manda al video en facebook:

https://www.facebook.com/IterAlgo/videos/vb.773998062620118/1039540819399173/?type=2&theater

La clasificación puede hacerse con diferente resolución en el mapa de salida.
Algunos resultados finales con distinta resolución se muestran en las imágenes fijas siguientes.
 

Adjuntos

  • TAPITAS_2970_256.JPG
    TAPITAS_2970_256.JPG
    22.7 KB · Visitas: 10
  • TAPITAS_2970_1600.JPG
    TAPITAS_2970_1600.JPG
    35.8 KB · Visitas: 8
  • TAPITAS_2970_3600.JPG
    TAPITAS_2970_3600.JPG
    42.4 KB · Visitas: 7
Última edición:
#modeTROLL_on
Si maña cuando salis de tu casa ves por casualidad un "T-800", yo que vos dejo todo como esta y cuando te agarre, le decis que era un chiste y que solo sabes programar qbasic :LOL:

#modeTROLL_off
:aplauso: Muy bueno Ale :cool: ; Fuera de broma, hoy eto se puede hacer gracias a los avances de la tecnologia (FPGA´s)... Ahora, te imaginas todo esto en sus inicios por alla a fines de la decada de los 70 / principios de los 80? cuack :unsure:
Lleva su buen tiempo de lectura para tan solo tener una minima nocion y o tratar de entender lo que estas hablando...Por mi parte es muy poca lectura que le di al respecto y solo puedo hablar por articuos y algun que otro repositorio que eh leido; Practicamene como estoy muy ejos de estas tematcas, no le inverti el tiempo que realmente se merece... Igualmente, muy bueno che, gracias Ale por compartir tu experiencia :aplauso:(y)
 
Aclaro que esto lo hice con visual basic solamente, y eso de ponerlo en físico es algo que pienso
hacer para otra aplicación más adelante cuando termine el curso de FPGA correspondiente.

Los mapas autoorganizados son relativamente fáciles de entender cómo funcionan y un poco
rebuscados para construir. Para que lo haga yo que recién empiezo no debe ser muy difícil.
Sólo sumas y productos y algunas horas de programación.

Pero esto no es nada.
Hay otras cosas más sofisticadas que están haciendo los muchachos de Google, como reconocer
estilos de un pintor a partir de uno de sus cuadros, y luego reproducir el mismo estilo sobre otra
imagen. Son otro tipo de redes más complejas, pero que corren en máquinas con placas gráficas
(GPU) relativamente comunes.

Como para darse una idea.
http://www.sciencedump.com/content/new-neural-algorithm-applies-artistic-styling-paintings-photos

gandalf.jpg
 
Última edición:
Algo como para empezar a comprender qué son, cómo funcionan las redes neuronales, y por qué están haciendo furor en estos años recientes.

http://www.xataka.com/robotica-e-ia/las-redes-neuronales-que-son-y-por-que-estan-volviendo

650_1200.png


En el texto enlaza a:
http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/
simple2_linear.png


Que lleva a este juguetito: http://cs.stanford.edu/people/karpathy/convnetjs//demo/classify2d.html

Espero que resulte instructivo y ayude a decidir a alguien para empezar a leer más en detalle.
 
Sin ánimo de hacer off topic, sólo quiero contarles a los que me siguieron en este tema, que a mis jóvenes 53 años, por fin estoy asistiendo al tan deseado curso de FPGA !!!
Asi que el T-800 que se vaya preparando, porque pronto tendrá que enfrentarse a mi ASH-1.0 !!!
 
Enlazo un video que explica cómo utilizar un algoritmo para extracción de características con el objeto de analizar las dimensiones de un conjunto de datos. Está pensado en 3D para poder graficar algo y sacar conclusiones a simple vista. Se puede extender la idea a cualquier dimensión, sólo que el procesamiento correspondiente llevará un tiempo proporcionalmente mayor.

http://www.anmaks.com/Sanger_3.mp4

Cualquier duda, si puedo veré de aclararla.

Si les gusta leer acá va la version pdf:

http://www.anmaks.com/REDES NEURONALES/Reducción de dimensiones usando Sanger.pdf

Esto puede aplicarse a la clasificación de un conjunto de fotografías.
Supongamos que tenemos un grupo de 300 fotos de caras de gatitos y queremos hacer un sistema que los reconozca. A cada foto la vamos a pensar como un "dato" (no un gato) descrito como un "arreglo de N pixeles".
N resulta ser la cantidad de coordenadas de cada foto, y por lo tanto la dimensión del espacio donde se define el conjunto. Para un análisis como este todas las fotos deben tener la misma resolución (cierto número de pixeles de ancho y de largo).
La dimensión de este espacio puede ser enorme dependiendo de la resolución de las fotos.
Pero por tratarse de fotos de un mismo tipo (caras de gatitos) es de esperar que exista una gran redundancia en el conjunto.
Por lo tanto en realidad no se necesitarán tantas dimensiones para caracterizarlo.
El algoritmo mostrado permite eliminar las redundancias para quedarse con la cantidad de dimensiones mínima, que es la cantidad de características en las que realmente difieren las fotos.
Cada una de estas características será consecuencia de que existen algunos patrones en las imágenes. Por ejemplo, un patrón corresponderá a la forma ovoidal promedio de las siluetas de la caras. Otro patrón corresponderá a la forma de las orejas, otro a la de los ojos, otro a la boca, etc.
Entonces, la cara de un gatito cualquiera se puede pensar como una combinación particular de cierta silueta de cara, cierto perfil de orejas, cierto formato de ojos, etc.
Al final, nuestros mapas de N pixeles serán descritos como un conjunto de coeficientes que permiten reconstruir cada fotografía individual a partir de unos pocos patrones comúnes.
La cantidad de coeficientes necesarios es mucho menor que la cantidad de pixeles N, lo que permite organizar los datos en forma práctica y ágil. Esto suele hacerse mediante otra red neuronal que ya he descrito, como ser los mapas autoorganizados o mapas de Cohonen.
¿ Se acuerdan del organizador de tapitas ?
 
Última edición:
Atrás
Arriba