Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
Werkstudent (m/w) in der MATLAB-Entwicklung
Branche: Luft-, Raumfahrttechnik, Dienstleistungen
univativ GmbH & Co. KG - Hamburg

Abschlussarbeit / Praktikum: Entwicklung Matlab (m/w)
Branche: Informationstechnologie, Elektrotechnik, Elektronik
GIGATRONIK Technologies GmbH - Ulm

Studentische Mitarbeit - Data Science und Toolentwicklung
Branche: mehrere
IAV GmbH - Berlin

Praktikant (m/w) Elektrofahrzeugsimulation im Backend
Branche: Elektrotechnik, Elektronik, Fahrzeugtechnik, Fahrzeugteile
DRÄXLMAIER Group - Garching bei München

Praktikant (m/w) modellbasierte Softwareentwicklung
Branche: Elektrotechnik, Elektronik, Fahrzeugtechnik, Fahrzeugteile
DRÄXLMAIER Group - Garching

weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Neural Network toolbox und parallel Computing (parfor)

 

uagka
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.12.16
Wohnort: Wo Carl ruhte
Version: ab R2016b
     Beitrag Verfasst am: 27.12.2016, 12:41     Titel: Neural Network toolbox und parallel Computing (parfor)
  Antworten mit Zitat      
Hallo zusammen,

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';

       
%% Leave One Out Approach      
    parfor i=1:size(X,1)
       
        Yc=Y_scaled;
        Yc(i,:)=[];
       
        Xc=X_scaled;
        Xc(i,:)=[];
        Xv=X_scaled(i,:);
       
        % 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');
       
        % Test the Network
        outputs_t(i,1)= sim(net,Xv');
       
       
    end

    %% Data Post-Processing (-1 to 1)

        outputs(:,j)=(((outputs_t+1)/2)*(max(Y)-min(Y)))+min(Y);

   
   
    %% Performance measures
        errors=outputs(:,j)-Y;
        errorsr=(outputs(:,j)-Y)./Y;
        R=corr(Y,outputs(:,j));
       
        R2(1,j)=R^2;                                             % Coefficient of Determination
        RMSE (1,j)= sqrt(mean((errors).^2));                     % Root Mean Squared Error
        BIAS(1,j)=mean(errors);                                  % BIAS
        RMSEr (1,j)= sqrt(mean((errorsr).^2))*100;               % Relative Root Mean Squared Error
        BIASr(1,j)=mean(errorsr)*100;                            % Relative BIAS
        NASH(1,j)=1-(sum(errors.^2)/sum((Y-mean(Y)).^2));        % Nash-Sutcliffe Criterion
       
        Error(1,j)=R2(1,j);
        Error(2,j)=BIAS(1,j);
        Error(3,j)=BIASr(1,j);
        Error(4,j)=RMSE(1,j);
        Error(5,j)=RMSEr(1,j);
        Error(6,j)=NASH(1,j);
   
    clear R errors errorsr  outputs_t
end
 


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.

Danke schonmal!

Viele Grüße
uagka
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 17.965
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 27.12.2016, 18:00     Titel:
  Antworten mit Zitat      
Hallo,

wie stark sind denn die Abweichungen?

Ein Unterschied könnte sein, dass innerhalb parfor die Prozesse singlethreaded arbeiten, während sonst Multithreading möglich ist.

Um das zu überprüfen, kannst du das mal in einer normalen for-Schleife laufen lassen mit
Code:
maxNumCompThreads(1)


Wenn du die äußere for-Schleife parallelisieren willst, solltest du das Innere der Schleife in eine Funktion auslagern.
Hilfreich könnten diese Tutorials sein, insbesondere Teil 4:
https://www.mathworks.com/videos/se.....ting-tutorials-97719.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
uagka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.12.16
Wohnort: Wo Carl ruhte
Version: ab R2016b
     Beitrag Verfasst am: 27.12.2016, 19:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

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!

Danke erstmal soweit.

Viele Grüße
uagka
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 17.965
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 27.12.2016, 22:05     Titel:
  Antworten mit Zitat      
Hallo,

ich zumindest sehe nicht den Grund für die hohen Abweichungen. Die unterschiedliche Anzahl von Threads sollte das nicht verursachen.

Eine Parallelisierung der äußeren for-Schleife dürfte aber auch mehr Performance bringen, sollte also definitiv einen Versuch wert sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
uagka
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 27.12.16
Wohnort: Wo Carl ruhte
Version: ab R2016b
     Beitrag Verfasst am: 28.12.2016, 18:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

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!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2018 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.