{"id":221,"date":"2021-07-26T17:37:47","date_gmt":"2021-07-26T17:37:47","guid":{"rendered":"https:\/\/constancy.com.ar\/wp\/?p=221"},"modified":"2021-07-26T17:40:58","modified_gmt":"2021-07-26T17:40:58","slug":"creacion-de-redes-neuronales-en-php","status":"publish","type":"post","link":"https:\/\/constancy.com.ar\/wp\/2021\/07\/26\/creacion-de-redes-neuronales-en-php\/","title":{"rendered":"Creaci\u00f3n de redes neuronales en PHP"},"content":{"rendered":"

Una red neuronal artificial (o ANN) es un algoritmo utilizado en inteligencia artificial para simular el pensamiento humano.\u00a0La red funciona de manera similar al cerebro humano: est\u00e1 compuesta por neuronas que se comunican entre s\u00ed y proporcionan resultados valiosos.\u00a0Aunque es solo un modelo, y ni siquiera se acerca al pensamiento humano, las redes neuronales artificiales se han utilizado en sistemas de predicci\u00f3n, clasificaci\u00f3n y soporte de decisiones, as\u00ed como en el reconocimiento \u00f3ptico de caracteres y muchas otras aplicaciones.<\/p>\n

Las redes neuronales artificiales se desarrollan principalmente en lenguajes de programaci\u00f3n de alto nivel como C o C ++, pero tambi\u00e9n puede implementar redes neuronales en PHP, que es quiz\u00e1s la forma m\u00e1s conveniente de usar la inteligencia artificial en aplicaciones web.\u00a0En este art\u00edculo, explicar\u00e9 c\u00f3mo configurar una de las topolog\u00edas de redes neuronales m\u00e1s comunes, la percepci\u00f3n de m\u00faltiples capas, y crear su primera red neuronal en PHP utilizando una\u00a0<\/a>clase de red neuronal PHP<\/a> (ver)<\/a>.<\/p>\n

Similar al proceso de pensamiento humano, una red neuronal:<\/p>\n

    \n
  1. recibe alguna entrada (sus datos)<\/li>\n
  2. lo analiza y lo procesa<\/li>\n
  3. proporciona un valor de salida (es decir, el resultado del c\u00e1lculo)<\/li>\n<\/ol>\n

    Es por eso que la topolog\u00eda en este ejemplo (percepci\u00f3n multicapa) tiene tres capas:<\/p>\n

      \n
    • Capa de entrada<\/li>\n
    • capa oculta<\/li>\n
    • capa de salida<\/li>\n<\/ul>\n

      Cada capa tiene una cierta cantidad de neuronas, seg\u00fan sus necesidades.\u00a0Cada neurona est\u00e1 conectada a todas las neuronas de la siguiente capa.\u00a0Las neuronas procesan la tarea dada ajustando la salida (es decir, los coeficientes de peso entre ellas).\u00a0Por supuesto, antes de que se puedan aplicar a un caso de uso pr\u00e1ctico, las redes neuronales deben aprender la tarea.\u00a0Pero, antes que todo, tienes que preparar tus datos para la red.<\/p>\n

      Entrada de red neuronal en PHP: preparaci\u00f3n de datos<\/h2>\n

      Debido a que las redes neuronales son modelos matem\u00e1ticos complejos, no puede enviar cualquier tipo de datos a las neuronas de entrada.\u00a0Los datos deben normalizarse antes de que la red pueda utilizarlos.\u00a0Esto significa que los datos deben escalarse en el rango de -1 a 1. Desafortunadamente, no hay una funci\u00f3n de normalizaci\u00f3n en PHP, por lo que tendr\u00e1 que hacerlo usted mismo, pero le dar\u00e9 la f\u00f3rmula:<\/p>\n

      I = Imin + (Imax-Imin)*(D-Dmin)\/(Dmax-Dmin)<\/code><\/pre>\n

      Donde\u00a0Imin<\/code>y\u00a0Imax<\/code>representan el rango de la red neuronal (-1 a 1), y\u00a0Dmin<\/code>y\u00a0Dmax<\/code>son los valores m\u00ednimo y m\u00e1ximo de los datos.<\/p>\n

      Despu\u00e9s de normalizar los datos, debe elegir el n\u00famero de neuronas de entrada.\u00a0Por ejemplo, si tiene colores RGB y desea determinar si el rojo o el azul es un color dominante, tendr\u00eda cuatro neuronas de entrada (tres neuronas para mantener los valores rojo, verde y azul, y la cuarta es el sesgo, que generalmente equivale a 1). .\u00a0Aqu\u00ed est\u00e1 el c\u00f3digo PHP para este c\u00e1lculo:<\/p>\n

      <?php\r\nrequire_once(\"class_neuralnetwork.php\");\r\n$n = new NeuralNetwork(4, 4, 1);  \/\/ the number of neurons in each layer of the network -- 4 input, 4 hidden and 1 output neurons \r\n $n->setVerbose(false); \/\/ do not display error messages\r\n\/\/test data\r\n\/\/ First array is input data, and the second is the expected output value (1 means blue and 0 means red)\r\n $n->addTestData( array (0, 0, 255, 1), array (1));\r\n  $n->addTestData( array (0, 0, 192, 1), array (1));\r\n  $n->addTestData( array (208, 0, 49, 1), array (0));\r\n  $n->addTestData( array ( 228,  105, 116, 1), array (0));\r\n\r\n  $n->addTestData( array (128, 80, 255, 1), array (1));\r\n  $n->addTestData( array ( 248,  80, 68, 1), array (0));\r\n?><\/code><\/pre>\n

      Solo hay una neurona de salida porque solo tiene dos resultados posibles.\u00a0Para problemas m\u00e1s complejos, puede utilizar m\u00e1s de una neurona como salida de red, por lo que tiene muchas combinaciones de 0 y 1 como salidas posibles.<\/p>\n

      Entrenamiento de una red neuronal en PHP<\/h2>\n

      Antes de poder resolver el problema, la red neuronal artificial debe aprender a resolverlo.\u00a0Piense en esta red como una ecuaci\u00f3n.\u00a0Ha agregado datos de prueba y la salida esperada, y la red tiene que resolver la ecuaci\u00f3n encontrando la conexi\u00f3n entre la entrada y la salida.\u00a0Este proceso se llama entrenamiento.\u00a0En las redes neuronales, estas conexiones son pesos neuronales.\u00a0Se utilizan algunos algoritmos para el entrenamiento de la red, pero la\u00a0propagaci\u00f3n hacia atr\u00e1s<\/em>\u00a0se utiliza con mayor frecuencia.\u00a0La propagaci\u00f3n hacia atr\u00e1s en realidad significa la propagaci\u00f3n hacia atr\u00e1s de los errores.<\/p>\n

      Despu\u00e9s de inicializar pesos aleatorios en la red, los siguientes pasos son:<\/p>\n

        \n
      1. Recorrer los datos de la prueba<\/li>\n
      2. Calcule la salida real<\/li>\n
      3. Calcule el error (salida deseada – salida de red actual)<\/li>\n
      4. Calcule los pesos delta al rev\u00e9s<\/li>\n
      5. Actualizar los pesos<\/li>\n<\/ol>\n

        El proceso contin\u00faa hasta que todos los datos de prueba se hayan clasificado correctamente o el algoritmo haya alcanzado un criterio de parada.\u00a0Por lo general, el programador intenta ense\u00f1ar a la red un m\u00e1ximo de tres veces, mientras que el n\u00famero m\u00e1ximo de rondas de entrenamiento (\u00e9pocas) es 1000. Adem\u00e1s, cada algoritmo de aprendizaje necesita una funci\u00f3n de activaci\u00f3n.\u00a0Para la propagaci\u00f3n hacia atr\u00e1s, la funci\u00f3n de activaci\u00f3n es tangente hiperb\u00f3lica (\u00a0tanh<\/code>)<\/p>\n

        Veamos c\u00f3mo entrenar una red neuronal en PHP:<\/p>\n

         <\/p>\n

        <?php<\/span>
        \n$max = 3;<\/span>
        \n\/\/ train the network in max 1000 epochs, with a max squared error of 0.01<\/span>
        \nwhile (!($success=$n->train(1000, 0.01)) && $max–>0) {<\/span>
        \n\/\/ training failed — re-initialize the network weights<\/span>
        \n$n->initWeights();<\/span>
        \n}<\/span><\/p>\n

        \/\/training successful<\/span>
        \nif ($success) {<\/span>
        \n$epochs = $n->getEpoch(); \/\/ get the number of epochs needed for training<\/span>
        \n}<\/span>
        \n?><\/span><\/p>\n

         <\/p>\n

        El error cuadr\u00e1tico medio (\u00a0mse<\/em>\u00a0) es el promedio de los cuadrados de los errores, que tambi\u00e9n se conoce como desviaci\u00f3n est\u00e1ndar.\u00a0El valor del error cuadr\u00e1tico medio predeterminado suele ser 0.01, lo que significa que el entrenamiento es exitoso si el error cuadr\u00e1tico medio es menor que 0.01.<\/p>\n

        Antes de ver el ejemplo funcional de una red neuronal artificial en PHP, es una buena pr\u00e1ctica guardar su red neuronal en un archivo o una base de datos SQL.\u00a0Si no lo guarda, deber\u00e1 realizar el entrenamiento cada vez que alguien ejecute su aplicaci\u00f3n.\u00a0Las tareas simples se aprenden r\u00e1pidamente, pero la capacitaci\u00f3n lleva mucho m\u00e1s tiempo para problemas m\u00e1s complejos y desea que sus usuarios esperen lo menos posible.\u00a0Afortunadamente, hay funciones de guardar y cargar en la\u00a0clase PHP en este ejemplo\u00a0:<\/p>\n

        <?php\r\n$n->save('my_network.ini');\r\n?><\/code><\/pre>\n

        Tenga en cuenta que la extensi\u00f3n del archivo debe ser\u00a0.ini<\/em>\u00a0.<\/p>\n

        El c\u00f3digo PHP para nuestra red neuronal<\/h2>\n

        Veamos el c\u00f3digo PHP de la aplicaci\u00f3n de trabajo que recibe valores de rojo, verde y azul y calcula si el color azul o rojo es dominante:<\/p>\n

        <?php\r\nrequire_once(\"class_neuralnetwork.php\");\r\n$r = $_POST['red'];\r\n$g = $_POST['green'];\r\n$b = $_POST['blue'];\r\n\r\n$n = new NeuralNetwork(4, 4, 1); \/\/initialize the neural network\r\n$n->setVerbose(false);\r\n$n->load('my_network.ini'); \/\/ load the saved weights into the initialized neural network. This way you won't need to train the network each time the application has been executed\r\n\r\n$input = array(normalize($r),normalize($g),normalize($b));  \/\/note that you will have to write a normalize function, depending on your needs\r\n\r\n$result = $n->calculate($input);\r\nIf($result>0.5) {\r\n\/\/ the dominant color is blue\r\n}\r\nelse {\r\n\/\/ the dominant color is red\r\n}\r\n?><\/code><\/pre>\n

        Limitaciones de la red neuronal<\/h2>\n

        La principal limitaci\u00f3n de las redes neuronales es que solo pueden resolver problemas linealmente separables y muchos problemas no son linealmente separables.\u00a0Por lo tanto, los problemas separables no linealmente requieren otro algoritmo de inteligencia artificial.\u00a0Sin embargo, las redes neuronales resuelven suficientes problemas que requieren inteligencia inform\u00e1tica para ganarse un lugar importante entre los algoritmos de inteligencia artificial.<\/p>\n","protected":false},"excerpt":{"rendered":"

        Una red neuronal artificial (o ANN) es un algoritmo utilizado en inteligencia artificial para simular…<\/p>\n","protected":false},"author":1,"featured_media":223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[48,49,50],"_links":{"self":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts\/221"}],"collection":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/comments?post=221"}],"version-history":[{"count":2,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts\/221\/revisions"}],"predecessor-version":[{"id":224,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/posts\/221\/revisions\/224"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/media\/223"}],"wp:attachment":[{"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/media?parent=221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/categories?post=221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/constancy.com.ar\/wp\/wp-json\/wp\/v2\/tags?post=221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}