Pracuję nad stworzeniem 2-warstwowej sieci neuronowej z propagacją wsteczną. NN powinien pobierać dane z wektora 20001x17, który przechowuje następujące informacje w każdym wierszu:Matlab - szkolenie z sieci neuronowej
- Pierwsze 16 komórek zawiera liczby całkowite od 0 do 15, które działają jak zmienne, aby pomóc nam określić, która z 26 liter alfabetu, który chcemy wyrazić podczas oglądania tych zmiennych. Na przykład serie 16 wartości w następujący sposób mają reprezentować literę A: [2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7].
-na siedemnastej komórce zawiera liczbę od 1 do 26 przedstawiającą literę alfabetu, którą chcemy. 1 oznacza A, 2 oznacza B itd.
Warstwa wyjściowa NN składa się z 26 wyjść. Za każdym razem, gdy NN jest zasilane wejściem podobnym do opisanego powyżej, ma wyprowadzać wektor 1x26 zawierający zera we wszystkich oprócz jednej komórki, która odpowiada literze, którą miały reprezentować wartości wejściowe. na przykład wyjście [1 0 0 ... 0] to litera A, natomiast [0 0 0 ... 1] to litera Z.
Kilka ważnych rzeczy, zanim przedstawię kod: I trzeba użyć funkcji traingdm i ukryty numer warstwy jest stały (na razie) na 21.
Próbując stworzyć powyższą koncepcję napisałem następujący kod Matlaba:
%%%%%%%%
%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%
%%%%%%%%
teraz mój problem: i chcę, aby moje wyniki były zgodne z opisem, a mianowicie każda kolumna wektora y2 powinna być na przykład reprezentacją litery. Mój kod tego nie robi. Zamiast tego uzyskano wyniki, które różnią się znacznie między 0 a 1, wartości od 0,1 do 0,9.
Moje pytanie brzmi: czy jest jakieś nawrócenie, które muszę wykonać, nie jestem? Czy muszę konwertować dane wejściowe i/lub wyjściowe na formę, dzięki której mogę zobaczyć, czy mój NN uczy się poprawnie?
Wszelkie dane wejściowe będą mile widziane.
Martin, dzięki za odpowiedź. Używając max (y2) mogę teraz uzyskać kilka informacji o tym, ile razy sieć miała rację, identyfikując litery. To, co zrobiłem, jednak przed wprowadzeniem do sieci danych, które posiadałem, skalowałem tak, aby 0 <= p (x) <= 1. Jako, że minimalna wartość p wynosiła 0, a maksymalna wynosiła 15, zrobiłem nowy wektor wejściowy scaledp = p/15. –
Nie powinieneś używać max jako funkcji działania, ponieważ twoja funkcja błędu powinna być zdefiniowana na podstawie aktywności, a nie aktywacji, a max nie jest różniczkowalna, co oznacza, że nie możesz użyć back-prop. Potrzebujesz softmax, zobacz moją odpowiedź poniżej. –