Descripción breve
Con el rápido desarrollo de Internet, A (AI) B (BigData) C (Cloud) se ha convertido en la dirección de desarrollo central en la actualidad. Si los tres están profundamente combinados, la IA es la parte más central de ella. Entonces, si todos deben aprender la programación en la sociedad futura, entonces para los programadores, la inteligencia artificial es la tecnología que deben dominar (el desarrollo de la tecnología es realmente rápido).
Este artículo presenta y utiliza Java para implementar una red de perceptrones más simple, sin enredar con la derivación de fórmulas, con el objetivo de proporcionarle ideas para aprender redes neuronales y tener una comprensión aproximada de las redes neuronales.
Análisis del modelo de red Perceptron
Primera mira a una foto
Si está un poco interesado en las redes neuronales, debe estar familiarizado con esta imagen. Esta imagen es un diagrama estructural de las neuronas
X1 ~ XM representa la entrada, W1 ~ Wm representa el peso sináptico, σ representa el nodo de suma, la función de activación representa la función de activación y luego emite un resultado. El proceso específico es
Cuando la neurona recibe la entrada, cada entrada se multiplicará por el peso en su ruta relativa. Cuando se alcanza el nodo sumador, el resultado del nodo de suma se establece en z:
z = x1 * w1 + x2 * w2 + x3 * w3 + ...... + xm * wm
Luego pase Z a la función de activación (aquí llamamos a la función de activación f) para el reconocimiento de patrones binarios:
Si f (x)> e, y = 1else y = -1e es el umbral y es el resultado de clasificación
Se puede ver aquí que si el valor de f (x) es mayor que el umbral, se obtiene la clasificación y = 1, y viceversa y = -1
Nota: En comparación con la respuesta indicada por la estimulación de las neuronas biológicas, si la estimulación está dentro de un rango aceptable, la neurona inhibirá la estimulación (y = -1), y si excede el rango, se excitará (y = 1), y la cuenca de este rango es el umbral (e)
estudiar
Descubrimos que si el peso y el umbral son fijos, entonces esta red neuronal no tiene sentido. Por lo tanto, introdujimos el concepto de aprendizaje y dejamos que la red neuronal modifique el peso y el umbral a través del aprendizaje, de modo que la precisión del reconocimiento de patrones se pueda corregir dinámicamente. Esta es la esencia del aprendizaje automático.
Entonces, ¿cómo aprender? Antes de usarlo, necesitamos proporcionar un conjunto de datos de muestra a esta red (que se toma aquí para aprender con el modo de maestro), los datos de la muestra incluyen datos de entrada x y el resultado de identificación correcto y '.
Cuando ingresamos datos de entrenamiento x y obtenemos el reconocimiento de patrones y, si Y! = Y ', se ajustarán el peso y el umbral de esta red. Consulte la fórmula para su ajuste. μ representa la tasa de aprendizaje (tasa de corrección), y la actualización representa la necesidad de corregirse:
update = μ * (yi - y ') update = (f (x) - y') mς wi += update * xii = 1e += update
Cuando el resultado de clasificación Perceptron es igual a la clasificación correcta, Update = 0, y la red no se ajusta; Si no es igual a la clasificación correcta, se ajustarán todos los pesos (W) y los umbrales (E)
Lo anterior es el proceso de aprendizaje más simple para los perceptrones que introduje:
Ingrese datos -> resumir para obtener z-> esperar a través de la función de activación para esperar los resultados de clasificación -> los resultados de la clasificación No coincidan con los resultados correctos, ajuste la red
Implementemos esta simple red neuronal
Implementación del código Java
Lo que he implementado aquí es aprender a reconocer lo positivo y negativo de los enteros a través de las redes neuronales. Primero, defina una clase que primero define un perceptrón.
/*** Creado por Cimzzz el 12/2/17. **/public class Perceptron {/*** tasa de aprendizaje*/privado final de float aprendizaje; / *** Número de tiempos de aprendizaje*/ Private Final Int StudyCount; / *** Umbral*/ privado float e; / *** peso* Debido a que solo se requiere una entrada para determinar el entero positivo y negativo, solo hay un peso aquí, y se pueden establecer múltiples entradas en una matriz*/ flotador privado w; / *** Tasa correcta para cada aprendizaje*/ flotador privado [] correctar; /// ** * El constructor inicializa la tasa de aprendizaje, el número de tiempos de aprendizaje, el peso y el umbral se inicializan a 0 * @param LearnRate Rate de aprendizaje (Rango de valor 0 <LearnRate <1) * @param Número de timbres de aprendizaje */ Public Perceptron (Float LearnRate, int StudyCount) {this. this.studyCount = StudyCount; this.e = 0; this.w = 0; this.Correctrate = New Float [StudyCount]; } / *** Función de aprendizaje, las muestras es una matriz bidimensional que contiene datos de entrada y resultados de clasificación,* muestras [] [0] representa datos de entrada* muestras [] [1] representa los resultados de clasificación correctos* @param muestras de datos de entrenamiento* / public void Fit (int [] [] muestras) {int SamplePlel longitud = muestras.length; para (int i = 0; i <studyCount; i ++) {int errorCount = 0; para (int [] muestra: muestras) {Float Update = LearnRate * (muestra [1] -Predict (muestra [0])); // Actualizar peso y umbral w += actualización * muestra [0]; e += actualización; // Calcule el número de error if (update! = 0) ErrorCount ++; } // Calcule la corrección de este aprendizaje correctamente [i] = 1 - ErrorCount * 1.0f /SampleLength; }} / *** Función de suma, simule Datos de entrada de operación de nodo Summing* peso* @param num datos de entrada* @return resulte z* / private float sum (int num) {return num* w + e; } / *** Active la función, Juez al resumir el resultado z y el umbral E* @param num datos de entrada* @return resulta* / public int predict (int num) {return sum (num)> = 0? 1: -1; }/*** Imprima precisión*/public void printCorrectrate () {for (int i = 0; i <studyCount; i ++) system.out.printf ("resultado del aprendizaje en %d-> %.2f %%/n", i +1, correctre [i]* 100); }}Luego escriba la función que genera los datos de capacitación
/*** Generar datos de entrenamiento* @@return datos de entrenamiento*/private static int [] [] genstudydata () {// Aquí tomamos un entero entre -100 y 100, y si es mayor que 0, establecerlo en modo y = 1, de lo contrario y = -1 int [] [] data = new int [201] [2]; para (int i = -100, j = 0; i <= 100; i ++, j ++) {data [j] [0] = i; datos [j] [1] = i> = 0? 1: -1; } Datos de retorno; } /*** Genere datos de entrenamiento* @@return datos de entrenamiento* /private static int [] [] genstudydata2 () {// Aquí tomamos un entero entre 1 ~ 250, y si es mayor de 125, establecerlo en modo y = 1, de lo contrario y = -1 int [] [] data = nuevo int [250] [2]; para (int i = 1, j = 0; i <= 250; i ++, j ++) {data [j] [0] = i; datos [j] [1] = i> = 125? 1: -1; } Datos de retorno; }Finalmente, la función principal
Public static void main (string [] args) {// La tasa de aprendizaje y los tiempos de entrenamiento aquí se pueden ajustar manualmente de acuerdo con la situación perceptron perceptron = new Perceptron (0.4f, 500); perceptron.fit (genstudydata ()); perceptron.printCorrectrate (); System.out.println (perceptron.predict (-1)); System.out.println (perceptron.predict (126)); }Puedes probarlo
limitación
Esta red neuronal de perceptrón es relativamente simple y es adecuada para datos divididos linealmente, como números positivos y negativos en la clasificación de cuadrantes de coordenadas unidimensionales y bidimensionales; Los datos que no se pueden clasificar correctamente no pueden clasificarse, como encontrar números primos, etc.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.