Je travaille à la création d'un réseau de neurones à 2 couches avec rétropropagation. Le NN est censé obtenir ses données à partir d'un vecteur 20001x17 contenant les informations suivantes dans chaque rangée:Matlab - Formation de réseau neuronal
-Les 16 premières cellules contiennent des entiers allant de 0 à 15 qui agissent comme des variables pour nous aider à déterminer laquelle des 26 lettres de l'alphabet que nous voulons exprimer en voyant ces variables. Par exemple, une série de 16 valeurs comme suit est censée représenter la lettre A: [2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7].
-La 17e cellule contient un nombre allant de 1 à 26 représentant la lettre de l'alphabet que nous voulons. 1 signifie A, 2 signifie B, etc.
La couche de sortie du NN est constituée de 26 sorties. Chaque fois que le NN reçoit une entrée comme celle décrite ci-dessus, il est supposé sortir un vecteur 1x26 contenant des zéros dans toutes les cellules, sauf la cellule correspondant à la lettre que les valeurs d'entrée sont supposées représenter. par exemple, la sortie [1 0 0 ... 0] serait la lettre A, alors que [0 0 0 ... 1] serait la lettre Z.
Certaines choses qui sont importantes avant de présenter le code: I besoin d'utiliser la fonction traingdm et le numéro de couche cachée est fixée (pour l'instant) à 21.
Essayer de créer le concept ci-dessus je l'ai écrit le code Matlab suivant:
%%%%%%%%
%Start of code%
%%%%%%%%
%
%Initialize the input and target vectors
%
p = zeros(16,20001);
t = zeros(26,20001);
%
%Fill the input and training vectors from the dataset provided
%
for i=2:20001
for k=1:16
p(k,i-1) = data(i,k);
end
t(data(i,17),i-1) = 1;
end
net = newff(minmax(p),[21 26],{'logsig' 'logsig'},'traingdm');
y1 = sim(net,p);
net.trainParam.epochs = 200;
net.trainParam.show = 1;
net.trainParam.goal = 0.1;
net.trainParam.lr = 0.8;
net.trainParam.mc = 0.2;
net.divideFcn = 'dividerand';
net.divideParam.trainRatio = 0.7;
net.divideParam.testRatio = 0.2;
net.divideParam.valRatio = 0.1;
%[pn,ps] = mapminmax(p);
%[tn,ts] = mapminmax(t);
net = init(net);
[net,tr] = train(net,p,t);
y2 = sim(net,pn);
%%%%%%%%
%End of code%
%%%%%%%%
maintenant à mon problème: je Je veux que mes sorties soient telles que décrites, à savoir que chaque colonne du vecteur y2 par exemple soit une représentation d'une lettre. Mon code ne fait pas ça. Au lieu de cela, il a produit des résultats qui varient grandement entre 0 et 1, des valeurs de 0,1 à 0,9.
Ma question est la suivante: y at-il une conversion que je dois faire que je ne suis pas? Signification, dois-je convertir mes données d'entrée et/ou de sortie à un formulaire par lequel je peux réellement voir si mon NN apprend correctement?
Toute contribution serait appréciée.
Martin, merci pour la réponse. En utilisant max (y2) je peux maintenant obtenir au moins quelques informations sur le nombre de fois que le réseau a eu raison d'identifier les lettres. Ce que j'ai fait cependant avant d'alimenter le réseau les données que j'ai ont été réduites de sorte que 0 <= p (x) <= 1. Voyant que la valeur minimale de p était 0 et le maximum était de 15, j'ai fait un nouveau vecteur d'entrée scaledp = p/15. –
Vous ne devez pas utiliser max comme fonction d'activité, car votre fonction d'erreur doit être définie sur l'activité et non sur l'activation, et max est non différentiable, ce qui signifie que vous ne pouvez pas utiliser back-prop. Vous avez besoin de softmax, voir ma réponse ci-dessous. –