Brève description
Avec le développement rapide d'Internet, une (AI) B (Bigdata) C (Cloud) est devenue la direction de développement de base à l'heure actuelle. Si les trois sont profondément combinés, l'IA en est la partie la plus essentielle. Donc, si tout le monde doit apprendre la programmation dans la future société, alors pour les programmeurs, l'intelligence artificielle est la technologie qu'ils doivent maîtriser (le développement de la technologie est vraiment rapide).
Cet article présente et utilise Java pour mettre en œuvre un réseau Perceptron le plus simple, sans s'emmêler avec la dérivation de la formule, visant à vous fournir des idées d'apprentissage des réseaux de neurones et de compréhension approximative des réseaux de neurones.
Analyse du modèle de réseau Perceptron
Regardez d'abord une image
Si vous êtes un peu intéressé par les réseaux de neurones, vous devez être familier avec cette image. Cette image est un diagramme structurel des neurones
X1 ~ XM représente l'entrée, W1 ~ WM représente le poids synaptique, σ représente le nœud sommant, la fonction d'activation représente la fonction d'activation, puis la sortie d'un résultat. Le processus spécifique est
Lorsque le neurone reçoit l'entrée, chaque entrée sera multipliée par le poids sur son chemin relatif. Lorsque le nœud sommain est atteint, le résultat du nœud sommer est défini sur z:
z = x1 * w1 + x2 * w2 + x3 * w3 + ...... + xm * wm
Ensuite, passez Z dans la fonction d'activation (ici, nous appelons la fonction d'activation f) pour la reconnaissance des motifs binaires:
Si f (x)> e, y = 1else y = -1e est le seuil y est le résultat de classification
On peut voir ici que si la valeur de f (x) est supérieure au seuil, la classification y = 1 est obtenue, et vice versa y = -1
Remarque: Par rapport à la réponse indiquée par la stimulation des neurones biologiques, si la stimulation se situe dans une plage acceptable, le neurone inhibera la stimulation (y = -1), et si elle dépasse la plage, elle sera excitée (y = 1), et le bassin versant de cette plage est le seuil (e)
étude
Nous avons constaté que si le poids et le seuil sont fixes, ce réseau neuronal n'a aucun sens. Par conséquent, nous avons introduit le concept d'apprentissage et laissé le réseau neuronal modifier le poids et le seuil par l'apprentissage, afin que la précision de la reconnaissance des modèles puisse être corrigée dynamiquement. C'est l'essence de l'apprentissage automatique.
Alors comment apprendre? Avant de l'utiliser, nous devons fournir un ensemble d'échantillons de données sur ce réseau (qui est pris ici pour apprendre avec le mode enseignant), l'échantillon de données comprend des données d'entrée x et le résultat d'identification correct y '.
Lorsque nous entrons les données de formation x et obtenons la reconnaissance des modèles y, si y! = Y ', le poids et le seuil de ce réseau seront ajustés. Veuillez vous référer à la formule pour l'ajustement. μ représente le taux d'apprentissage (taux de correction) et la mise à jour représente la nécessité d'être corrigée:
Mise à jour = μ * (yi - y ') Update = (f (x) - y') mς wi + = mise à jour * xii = 1e + = mise à jour
Lorsque le résultat de la classification Perceptron est égal à la classification correcte, Update = 0, et que le réseau n'est pas ajusté; S'il n'est pas égal à la classification correcte, tous les poids (w) et les seuils (e) seront ajustés
Ce qui précède est le processus d'apprentissage le plus simple pour les perceptrons que j'ai introduits:
Entrez les données -> Résumé pour obtenir z-> attendre la fonction d'activation pour attendre les résultats de la classification -> Les résultats de la classification ne correspondent pas aux résultats corrects, ajustez le réseau
Implémentons ce simple réseau neuronal
Implémentation du code Java
Ce que j'ai mis en œuvre ici, c'est apprendre à reconnaître le positif et le négatif des entiers à travers les réseaux de neurones. Tout d'abord, définissez une classe qui définit d'abord un perceptron.
/ ** * Créé par Cimzzz le 12/2/17. * * / classe publique Perceptron {/ ** * Taux d'apprentissage * / Float final Private Learnrate; / ** * Nombre de temps d'apprentissage * / private final int stuckount; / ** * Threshold * / Float privé E; / ** * poids * Parce qu'une seule entrée est nécessaire pour déterminer l'entier positif et négatif, il n'y a qu'un seul poids ici, et plusieurs entrées peuvent être définies sur un tableau * / float privé w; / ** * Taux correct pour chaque apprentissage * / float privé [] Correctrate; // / ** * Le constructeur initialise le taux d'apprentissage, le nombre de temps d'apprentissage, le poids et le seuil sont initialisés à 0 * @param Learnrate Learning taux (plage de valeur 0 <Learnrate <1) * @param studyCount Nombre de temps d'apprentissage * / public perceptron (Float Learnrate, int stuckonte) {this.learnrate = apprentissage; this.StudCycount = stuckount; this.e = 0; this.w = 0; this.Correctrate = new float [stuycount]; } / ** * Fonction d'apprentissage, les échantillons sont un tableau bidimensionnel contenant des données d'entrée et des résultats de classification, * Les échantillons [] [0] représentent les données d'entrée * Les échantillons [] [1] représentent les résultats de classification corrects * @param échantillons de formation des données * / public void fit (int [] [] échantillons) {int saampleLenngth = échantillons. for (int i = 0; i <stuycount; i ++) {int errorCount = 0; pour (int [] exemple: échantillons) {float update = Learnrate * (sampon [1] -predict (sampon [0])); // Mise à jour du poids et du seuil W + = Update * Exemple [0]; e + = mise à jour; // Calculez le numéro d'erreur si (mise à jour! = 0) errorCount ++; } // Calculez l'exactitude de cet apprentissage correctement [i] = 1 - errorCount * 1.0f / sampleLength; }} / ** * Fonction SUM, simulez les données d'entrée de l'opération de nœud de résumé * poids * @param num Données d'entrée * @return Sum Résultat Z * / Private Float Sum (int num) {return num * w + e; } / ** * Activez la fonction, jugez en additionnant le résultat z et seuil e * @param num Données d'entrée * @return Classification Result * / public int Predict (int num) {return sum (num)> = 0? 1: -1; } / ** * PRÉSCURATIF IMPRESS * / public void printCorrectrate () {for (int i = 0; i <stuycount; i ++) System.out.printf ("Résultat de l'apprentissage à% d->% .2f %% / n", i + 1, Correctrate [i] * 100); }}Ensuite, écrivez la fonction qui génère les données de formation
/ ** * générer des données de formation * @return Données de formation * / private static int [] [] GenstudyData () {// Ici, nous prenons un entier entre -100 et 100, et s'il est supérieur à 0, définissez-le en mode y = 1, sinon y = -1 int [] [] data = new int [201] [2]; pour (int i = -100, j = 0; i <= 100; i ++, j ++) {data [j] [0] = i; data [j] [1] = i> = 0? 1: -1; } return data; } / ** * générer des données de formation * @return Données de formation * / private static int [] [] GenstudyData2 () {// Nous prenons ici un entier entre 1 ~ 250, et si plus de 125, le définissez en mode y = 1, sinon y = -1 int [] [] data = new int [250] [2]; for (int i = 1, j = 0; i <= 250; i ++, j ++) {data [j] [0] = i; data [j] [1] = i> = 125? 1: -1; } return data; }Enfin, la fonction principale
public static void main (String [] args) {// Le taux d'apprentissage et les temps de formation ici peuvent être ajustés manuellement en fonction de la situation Perceptron perceptron = new Perceptron (0,4f, 500); perceptron.fit (GenstudyData ()); perceptron.printCorrectrate (); System.out.println (perceptron.predict (-1)); System.out.println (perceptron.predict (126)); }Vous pouvez le tester
limitation
Ce réseau neuronal perceptron est relativement simple et convient aux données linéairement divisées, telles que les nombres positifs et négatifs en classification des quadrants coordonnés bidimensionnels et bidimensionnels; Les données qui ne peuvent pas être classées correctement ne peuvent pas être classées, comme la recherche de nombres premiers, etc.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.