La programmation d'une Base de Réseau de Neurones à partir de zéro dans MATLAB
J'ai posé quelques questions à propos des réseaux de neurones sur ce site dans le passé et ont obtenu d'excellents réponses, mais j'ai encore de la difficulté à mettre en œuvre une pour moi. C'est tout à fait une longue question, mais j'espère qu'elle servira de guide pour d'autres personnes à créer leur propre base de réseaux de neurones dans MATLAB, il devrait donc être en vaut la peine.
Ce que j'ai fait jusqu'à présent pourrait être tout à fait tort. Je suis en ligne de stanford de la machine en cours d'apprentissage par le Professeur Andrew Y. Ng et ont essayé de mettre en application ce qu'il a appris à faire de mon mieux.
Pouvez-vous svp me dire si l'alimentation de l'avant et de la fonction de coût parties de mon code sont corrects, et où je vais mal dans la minimisation (optimisation)?
J'ai une alimentation de couche 2 d'avance réseau de neurones.
Le code MATLAB pour l'anticipation de la partie est:
function [ Y ] = feedforward2( X,W1,W2)
%This takes a row vector of inputs into the neural net with weight matrices W1 and W2 and returns a row vector of the outputs from the neural net
%Remember X, Y, and A can be vectors, and W1 and W2 Matrices
X=transpose(X); %X needs to be a column vector
A = sigmf(W1*X,[1 0]); %Values of the first hidden layer
Y = sigmf(W2*A,[1 0]); %Output Values of the network
Y = transpose(Y); %Y needs to be a column vector
Ainsi, par exemple, une à deux couches de neurones net avec deux entrées et deux sorties ressemblerait un peu à ça:
a1
x1 o--o--o y1 (all weights equal 1)
\/ \/
/\ /\
x2 o--o--o y2
a2
si nous avons mis en:
X=[2,3];
W1=ones(2,2);
W2=ones(2,2);
Y = feedforward2(X,W1,W2)
nous obtenons le la sortie:
Y = [0.5,0.5]
Cela représente y1 et y2 valeurs indiquées dans le dessin du réseau neuronal
Le code MATLAB pour l'erreur quadratique de la fonction de coût est:
function [ C ] = cost( W1,W2,Xtrain,Ytrain )
%This gives a value seeing how close W1 and W2 are to giving a network that represents the Xtrain and Ytrain data
%It uses the squared error cost function
%The closer the cost is to zero, the better these particular weights are at giving a network that represents the training data
%If the cost is zero, the weights give a network that when the Xtrain data is put in, The Ytrain data comes out
M = size(Xtrain,1); %Number of training examples
oldsum = 0;
for i = 1:M,
H = feedforward2(Xtrain,W1,W2);
temp = ( H(i) - Ytrain(i) )^2;
Sum = temp + oldsum;
oldsum = Sum;
end
C = (1/2*M) * Sum;
end
Exemple
Ainsi, par exemple, si les données d'apprentissage est:
Xtrain =[0,0; Ytrain=[0/57;
1,2; 3/57;
4,1; 5/57;
5,2; 7/57; a1
3,4; 7/57; %This will be for a two input one output network x1 o--o y1
5,3; 8/57; \/ \_o
1,5; 6/57; /\ /
6,2; 8/57; x2 o--o
2,1; 3/57; a2
5,5;] 10/57;]
Nous commençons avec initiale aléatoire des poids
W1=[2,3; W2=[3,2]
4,1]
Si nous avons mis en:
Y= feedforward2([6,2],W1,W2)
Nous obtenons
Y = 0.9933
Qui est loin de ce que les données d'apprentissage dit qu'il devrait être (8/57 = 0.1404). Donc, la première aléatoire des poids W1 et W2 où une mauvaise proposition.
De mesurer exactement comment le mauvais/bon une estimation aléatoire des poids de pondération sont, nous utilisons la fonction de coût:
C= cost(W1,W2,Xtrain,Ytrain)
Cela donne de la valeur:
C = 6.6031e+003
En minimisant la fonction de coût
Si nous minimiser la fonction de coût par la recherche de toutes les variables possibles, W1 et W2, puis ramasser le plus bas, le réseau qui se rapproche des données de formation
Mais quand j'utilise le code:
[W1,W2]=fminsearch(cost(W1,W2,Xtrain,Ytrain),[W1,W2])
Il donne un message d'erreur. Il dit: "Erreur à l'aide de horzcat. CHAT arguments dimensions ne sont pas compatibles."Pourquoi j'obtiens ce message d'erreur et que puis-je faire pour le réparer?
Pouvez-vous svp me dire si l'alimentation de l'avant et de la fonction de coût parties de mon code sont corrects, et où je vais mal dans la minimisation (optimisation)?
Merci!!!!!!
OriginalL'auteur Blue7 | 2014-02-24
Vous devez vous connecter pour publier un commentaire.
Votre réseau de Neurones semble correct, bien que le type de formation que vous essayez de faire est très efficace si vous êtes à la formation, à l'encontre de données étiquetées comme vous le faites. Dans ce cas, je vous suggère de regarder dans Back-propagation de l'
Au sujet de votre erreur lors de la formation: Votre message d'erreur d'indices sur le problème:
dimensions are not consistent
Comme argument
x0
dansfminsearch
qui est de l'estimation initiale de l'optimiseur, vous envoyez[W1, W2]
mais de ce que je peux voir, ces matrices n'ont pas le même nombre de lignes, et, par conséquent, vous ne pouvez pas les ajouter ensemble comme ça. Je suggère de modifier votre coût-fonction de prendre un vecteur comme argument et la forme de votre poids-vecteurs des différentes couches d'un vecteur.Vous êtes également ne pas fournir le coût de fonctionner correctement à
fminsearch
que vous êtes juste évaluation decost
avec w1, w2, Xtrain et Ytrain en place.Selon la la documentation (ça fait des années depuis que j'ai utilisé Matlab) il me semble que vous passez le pointeur sur le coût de la fonction comme
fminsearch(cost, [W1; W2])
EDIT: Vous pourrez exprimer votre poids et de modifier votre code comme suit:
Coût-fonction doit être modifiée de telle sorte qu'il ne prend pas Xtrain, Ytrain comme entrée parce que fminsearch va alors essayer d'optimiser ces trop. Modifier votre coût de la fonction comme ceci:
Voir mise à jour de réponse.
OriginalL'auteur PureW