2017-09-16 11 views
0

Ich habe dies folgenden Code für ein wenig ai eigen verwenden, aber es einige seltsame Verhalten hat, wennC++ Eigen wirft Fehler aber beendet Berechnung

#include <stdio.h> 
#include <iostream> 
#include <time.h> 
#include <math.h> 
#include <Eigen/Dense> 

using namespace std; 
using namespace Eigen; 

MatrixXd sigmoid(MatrixXd); 
MatrixXd sigmoid_d(MatrixXd); 


class Layer{ 
public: 
MatrixXd layerweights; 

Layer(int x,int y){ 
    layerweights.resize(x,y); 
    for(int i=0;i<layerweights.rows();i++){ 
     for(int j=0;j<layerweights.cols();j++){ 
      double r =(rand()/(double)(RAND_MAX)) * 2 - 1; 
      layerweights(i,j) = r; 
     } 
    } 
} 
Layer(){ 
    this->layerweights.setZero(); 
} 
}; 

class Network{ 
public: 
Layer l1; 
Layer l2; 
MatrixXd inp; 
MatrixXd outp; 
int id; 

Network(){ 
    id = 0; 
    inp.resize(1,5); 
    inp << 0,1,2,3,4; 
    outp.resize(1,5); 
    outp << 0,1,4,9,16; 
} 

MatrixXd think(){ 
    MatrixXd ol1 = sigmoid(inp * l1.layerweights);//1x5*5x5 1x5 
    MatrixXd ol2 = sigmoid(ol1 * l2.layerweights); //1x5*5x5 1x5 
    return ol2; 
} 



int main() { 
Network generation [10]; 
srand(time(NULL)); 
for(int i=0;i<6;i++){      //initialize 1st generation 
    generation[i].l1 = Layer(5,5); 
    generation[i].l2 = Layer(5,5); 
    generation[i].id = i; 
} 

for(int i=0;i<=6;i++){ 
    cout<<generation[i].think()<<'\n'; 
} 

return 0; 
} 

MatrixXd sigmoid(MatrixXd x){ 
return 1./(1+(x.array() * -1).exp()); 
} 

die Ausgabe in der Konsole ausgeführt:

Assertion failed: lhs.cols() == rhs.rows() & & "ungültiges Matrixprodukt" & & "Wenn Sie ein Koeff-weises oder ein Punktprodukt verwenden möchten, verwenden Sie die entsprechenden expliziten Funktionen", Datei c: \ mingw \ include \ eigen \ src/Kern/Produkt.h, Zeile 97

Diese Anwendung hat die Runtime aufgefordert, sie auf ungewöhnliche Weise zu beenden. Wenden Sie sich für weitere Informationen bitte an das Support-Team der Anwendung.

15,7222 7,48441 15,4497 8,88806 15,2964 8,90715 7,4913 4,46665 11,0792 9,32262 4,38281 5,5597 6,06866 7,33861 3,5983 5,69089 2,82105 8,79453 2,2928 7,4683 14,2536 5,6492 11,3739 11,9831 5,04955 9,85721 16,4741 4,57733 3,87002 2,37858

auch öffnet es die gena_exe nicht funktioniert Fenster (ich arbeite an einem Windows-Laptop).

die seltsame daran ist, dass die prūogram zu beenden excuted und doesnt zu stoppen vielleicht ist es nur, weil mein Code ist schneller als die Fehler Handhabung, wenn der Fehler

auftritt

Bitte helfen - danke

Antwort

2

Ok, es hat mich eine Sekunde, aber ich fand heraus, was passiert: Sie erstellen 6 Generationen in der ersten Schleife for (int i = 0; i<6; i++) aber in MatrixXd ol1 = sigmoid(inp * l1.layerweights)

ändern 012 über 7 in nächste for(int i=0;i<=6;i++), so letzte Anruf bekommt null Matrix iterierenin i<6 und es wird keinen Absturz geben.

Aber die Sache ist, Sie könnten es auf eigene Faust sehr leicht mit Hilfe von Debugger herausgefunden haben. Es ist ein wirklich hilfreiches Tool und die meisten IDEs unter Windows haben einen Build. Ich ermutige Sie, es zu benutzen.

Auch wenn Ihr Programm single-threaded ist, gibt es keine Chance für Code "schneller als die Fehlerbehandlung, wenn der Fehler auftritt". Sobald du versucht hast, einen ungültigen mathematischen Ausdruck zu erstellen, hat Eigen ihn behauptet und dein Programm geschlossen, aber was auch immer schon gedruckt wurde, wurde aufrechterhalten.

+0

danke für deine antwort, jetzt benutze ich das eclipse debugging tool –

Verwandte Themen