zunächst einmal eine Erläuterung zum Workflow. Unten stehender Code soll mir helfen den optimalen Aufbau für ein neuronales Netz zu finden und liefert mir dafür Fehlerwerte für unterschiedlich große Hidden Layer. Dafür sind zwei Loops ineinander geschachtelt.
1. Anzahl der Hidden Nodes ("j") wird geändert
2. Evaluierung mittels Leave-One-Out Approach
Beim sog. leave-one.out Ansatz wird zu Evaluierungszwecken immer ein Wertepaar von Input und Target beim Training ausgelassen und fürs Testing genutzt. Da bei einem Datensatz der Größe 100 der entsprechende Loop eben auch 100 mal gerechnet wird und das auch schnell mal ziemlich lang dauert für große Datensätze, habe ich mich an parallel computing versucht.
In der Sequentiellen Version meines Codes wird das neuronale Netz vor dem entsprechenden Leave-one-out-Loop generiert:
Code:
% Generating Net
net = fitnet(HL_size); %neural net with one hidden layer
% Transfer functions
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'purelin';
Da mir Matlab aber gesagt hat, dass das für "parfor" nicht geht, habe ich diesen Teil nun innerhalb des Loop platziert.Hierbei entstehen mir nun leicht abweichende Ergebnisse im Vergleich zur berechnung ohne parfor. Woran liegt das? Wird das Netz nicht richtig trainiert, weil es immer neu generiert wird? Oder liegt es an etwas ganz anderem (irgendwo ein "different set of random numbers" das irgendwo zugrunde liegt oder sowas)? Ich bin für alle Tipps dankbar.
Code:
for j = HL_size_min:Hidden_nodes %number of hidden Nodes
HL_size = j;
% % Generating Net % net = fitnet(HL_size); %neural net with one hidden layer % % Transfer functions % net.layers{1}.transferFcn = 'tansig'; % net.layers{2}.transferFcn = 'purelin';
% Generating Net
net = fitnet(HL_size); %neural net with one hidden layer
% Transfer functions
net.layers{1}.transferFcn = 'tansig';
net.layers{2}.transferFcn = 'purelin';
% Setup Division of Data for Training and Validation
net.divideFcn = 'dividerand'; % Divide data randomly
net.divideMode = 'sample'; % Divide up every sample
net.divideParam.trainRatio = 90/100;
net.divideParam.valRatio = 10/100;
% Training Function
net.trainFcn = 'trainlm'; % Levenberg-Marquardt
net.trainParam.max_fail=25; % Maximum validation failures
% Performance Function
net.performFcn = 'mse'; % Mean squared error
% Train the Network [net,tr] = train(net,Xc',Yc');
Abgesehen von meinen abweichenden Ergebnissen funktioniert der parfor Loop und hat die Berechnungszeit auf die Hälfte gedrückt.
Ursprünglich hatte ich zudem vorgehabt nur den 1. Loop als parfor Loop zu rechnen, scheitere jedoch noch an der Verwendung von outputs_t, Error und clear - hier werden mir noch Fehlermeldungen generiert.
Ich bin insgesamt noch recht neu bei Matlab (ca. 1 Monat) und bin auch für allgemeine Verbesserungsvorschläge zum Code dankbar.
Noch allgemein: Input (X, bzw. X_scaled (entspricht X nach pre processing)) ist ein drei Spalten Array variabler Länge; Target (Y, bzw. Y_scaled) ist ein Array mit einer Spalte und entsprechend gleicher Länge wie X_scaled
Beim obigen Code handelt es sich lediglich um einen Ausschnitt, Datenaufruf, Pre-und Postprocessing, Erstellung von nötigen Matrizen etc. habe ich erstmal weggelassen.
Falls ich irgendwelchen essentiellen Infos vergessen habe, einfach fragen.
die Abweichung liegt in einer Größenordnung von etwa 15% und damit für meine Anwendung leider nicht vernachlässigbar. Deine Vorschläge werde ich morgen direkt mal testen. Besonders das mit der Auslagerung in eine Funktion klingt super!
Auslagerung in eine Funktion klappt super, danke für den Tipp. Was die Abweichungen angeht bin ihc noch nicht weiter. Aber das löst sich sicher auch noch irgendwann.
Danke!
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.