Redes neuronales: este es un tema que causa un gran interés y un deseo de comprenderlo. Pero, desafortunadamente, no se presta a todos. Cuando ve volúmenes de literatura oscura, pierde el deseo de estudiar, pero aún así desea mantenerse al tanto de lo que está sucediendo.
Al final, me pareció que no hay mejor manera de resolverlo que simplemente tomar y crear su propio proyecto pequeño.
Puede leer el fondo de la letra expandiendo el texto, o puede omitir esto e ir directamente a la
descripción de la red neuronal.¿Cuál es el punto de hacer tu proyecto?Pros:
- Usted comprende mejor cómo están organizadas las neuronas.
- Comprende mejor cómo trabajar con bibliotecas existentes
- Aprendiendo algo nuevo en paralelo
- Hazle cosquillas a tu ego, creando algo propio
Contras:
- Estás creando una bicicleta, probablemente peor que las existentes.
- A nadie le importa tu proyecto.
La elección del idioma.Al momento de elegir el lenguaje, sabía más o menos C ++ y estaba familiarizado con los conceptos básicos de Python. Es más fácil trabajar con neuronas en Python, pero C ++ lo sabía mejor y no hay una paralelización de los cálculos más sencilla que OpenMP. Por lo tanto, elegí C ++, y la API para Python, para no molestarme, creará un
trago que funcione en Windows y Linux. (
Un ejemplo de cómo hacer una biblioteca Python a partir de código C ++)
OpenMP y aceleración de GPU.Por el momento, OpenMP versión 2.0 está instalado en Visual Studio, en el que solo hay aceleración de la CPU. Sin embargo, a partir de la versión 3.0, OpenMP también admite la aceleración de GPU, mientras que la sintaxis de las directivas no es complicada. Solo queda esperar hasta que OpenMP 3.0 sea compatible con todos los compiladores. Mientras tanto, por simplicidad, solo la CPU.
Mi primer rastrillo.Existe el siguiente punto en el cálculo del valor de una neurona: antes de calcular la función de activación, necesitamos agregar la multiplicación de pesos por los datos de entrada. Cómo aprender a hacer esto en la universidad: antes de sumar un vector grande de números pequeños, debe ordenarse en orden ascendente. Entonces aquí. En las redes neuronales, además de ralentizar el programa N veces, esto no da nada. Pero me di cuenta de esto solo cuando ya había probado mi red en MNIST.
Poner un proyecto en GitHub.No soy el primero en publicar mi creación en GitHub. Pero en la mayoría de los casos, siguiendo el enlace, solo ve un montón de código con la inscripción en README.md
"Esta es mi red neuronal, mire y estudie" . Para ser mejor que otros, al menos en esto, describió más o menos
README.md y completó el
Wiki . El mensaje es simple:
complete el Wiki. Una observación interesante: si el título en Wiki en GitHub está escrito en ruso, entonces el
ancla de este título no funciona.
LicenciaCuando creas tu pequeño proyecto, una licencia vuelve a ser una forma de hacerle cosquillas a tu ego. Aquí hay un
artículo interesante sobre para qué sirve una licencia. Opté por
APACHE 2.0 .
Descripción de la red.
Caracteristicas
La principal ventaja de mi biblioteca es la creación de una red con una línea de código.
Es fácil ver que en capas lineales el número de neuronas en una capa es igual al número de parámetros de entrada en la siguiente capa. Otra declaración obvia: el número de neuronas en la última capa es igual al número de valores de salida de la red.
Creemos una red que reciba tres parámetros en la entrada, que tiene tres capas con 5, 4 y 2 neuronas.
import foxnn nn = foxnn.neural_network([3, 5, 4, 2])
Si observa la imagen, puede ver: primero 3 parámetros de entrada, luego una capa con 5 neuronas, luego una capa con 4 neuronas y, finalmente, la última capa con 2 neuronas.

Por defecto, todas las funciones de activación son sigmoides (me gustan más).
Si lo desea, en cualquier capa se puede cambiar a otra función.
Las funciones de activación más populares están disponibles. nn.get_layer(0).set_activation_function("gaussian")
Conjunto de entrenamiento fácil de crear. El primer vector son los datos de entrada, el segundo vector son los datos de destino.
data = foxnn.train_data() data.add_data([1, 2, 3], [1, 0])
Entrenamiento en red:
nn.train(data_for_train=data, speed=0.01, max_iteration=100, size_train_batch=98)
Habilitación de la optimización:
nn.settings.set_mode("Adam")
Y un método para obtener el valor de la red:
nn.get_out([0, 1, 0.1])
Un poco sobre el nombre del método.Por separado, get traduce cómo llegar , y out significa salida . Quería obtener el nombre " dar el valor de salida ", y lo obtuve. Solo más tarde me di cuenta de que resultó salir . Pero es más divertido, y decidí irme.
Prueba
Ya se ha convertido en una tradición no escrita probar cualquier red basada en
MNIST . Y no fui la excepción. Todo el código con comentarios se puede encontrar
aquí .
Crea una muestra de entrenamiento: from mnist import MNIST import foxnn mndata = MNIST('C:download/') mndata.gz = True imagesTrain, labelsTrain = mndata.load_training() def get_data(images, labels): train_data = foxnn.train_data() for im, lb in zip(images, labels): data_y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Cree una red: tres capas, 784 parámetros para entrada y 10 para salida: nn = foxnn.neural_network([784, 512, 512, 10]) nn.settings.n_threads = 7
Nosotros entrenamos: nn.train(data_for_train=train_data, speed=0.001, max_iteration=10000, size_train_batch=98)
Que paso:
En aproximadamente 10 minutos (solo aceleración de CPU), se puede obtener una precisión del 75%. Con la optimización Adam, se puede obtener un 88% de precisión en 5 minutos. Al final, logré lograr una precisión del 97%.
Las principales desventajas (ya hay planes de revisión):- En Python, aún no se han cometido errores, es decir en python, el error no será interceptado y el programa simplemente saldrá con un error.
- Mientras que el entrenamiento se indica en iteraciones, y no en eras, como es habitual en otras redes.
- Sin aceleración de GPU
- Todavía no hay otros tipos de capas.
- Necesitamos subir el proyecto a PyPi.
Para completar un poco el proyecto, faltaba este artículo. Si al menos diez personas están interesadas y juegan, entonces ya habrá una victoria. Bienvenido a mi
github .
PD: Si necesita crear algo propio para resolverlo, no tenga miedo y cree.