#include "fonctions.h" #include #include #include #include #include #include #include #include"../Neurone/Neurone.h" #include"../Neurone/NeuroneB.h" #include"../Layer/Layer.h" #include"../Reseau/Reseau.h" #include"../Common/fonctions.h" #include"../Settings/Settings.h" /** * Affichage de vecteur DOUBLE * @method printVec * @param vec Vecteur à afficher */ void printVec (std::vector vec){ for (unsigned int i=0;i vec){ for (unsigned int i=0;i > vec){ for (unsigned int i=0;i > > vec){ std::cout<<"<"; for(unsigned int k =0; k < vec.size();k++){ std::cout<<"<"; for (unsigned int i=0;i"; if ( i != vec[k].size()-1){ std::cout<<","; } } std::cout<<">"<<(k!=vec.size() ? " ":">")< > getInput(char const * fileName){ /** * Counter */ std::ifstream in(fileName); std::string ligne; int nbLignes = 0; while(std::getline(in, ligne)){ nbLignes++; } in.close(); /** * Parser */ std::ifstream fichier(fileName, std::ios::in); if(fichier){ std::vector< std::vector > stock(nbLignes); // Tableau de chaine de caractère qui va contenir tout le fichier ligne par ligne std::cout << "\033[1;36m file " << "\033[1;31m" << fileName << "\033[1;36m opened with success , nbLignes= " <>ligne; std::stringstream ss(ligne); /** strinsplit à partir du caractère ',' */ while (getline(ss, s, ',')) { temp = atof(s.c_str()); stock[j].push_back(temp); } } swapVec(&stock); fichier.close(); return stock; } else { std::cerr << "\033[0;31m ERROR [ "<< "Can't open file" << " IN FILE " << __FILE__ << " AT LINE " << __LINE__ << " ] \n \033[0m"; std::vector< std::vector > stock(nbLignes); return stock; } } /** * Extraction de la derniére colonne d'un tableau bi-dimensionnel (vecteur de vecteur) * @method extractResult * @param input Vecteur de vecteur */ std::vector extractResult(std::vector< std::vector > * input){ std::vector res(input->size()); unsigned int pos =((*input)[0].size())-1; for(unsigned int i=0;isize();i++){ res[i]=(*input)[i][pos]; (*input)[i].pop_back(); } return res; } /** * Echange de vecteur aléatoire avec synchronisation * @method swapVec * @param input Vecteur de vecteur à échanger * @param result Autre vecteur à synchroniser */ void swapVec (std::vector > * input, std::vector * result){ unsigned int r; for (unsigned int i=0;isize();i++){ do{ r = rand()%input->size(); }while(r == i); (*input)[i].swap((*input)[r]); iter_swap(result->begin() + i ,result->begin() + r); } } /** * Echange de vecteur aléatoire * @method swapVec * @param input Vecteur de vecteur à échanger */ void swapVec (std::vector > * input){ unsigned int r; for (unsigned int i=0;isize();i++){ do{ r = rand()%input->size(); }while(r == i); (*input)[i].swap((*input)[r]); } } unsigned int int_to_int(unsigned k) { if (k == 0) return 0; if (k == 1) return 1; /* schlagué */ return (k % 2) + 10 * int_to_int(k / 2); } /** * Génération d'entrées pour OU et ET * @method generateInput * @param n Nombre d'entrées * @param estet True si génération de ET sinon False pour OU */ std::vector > generateInput(int n, bool estet){ int nbtest = (int)pow(2,n); std::vector< std::vector < double > > testtab(nbtest, std::vector(n,0)); for (int i =0; i < nbtest; i ++){ int tmp = i; tmp = int_to_int(tmp); for (int j =0; j < n; j ++){ testtab[i][j]= (tmp/(int)pow(10,n-1-j)==1?1 : 0) ; tmp = tmp- (testtab[i][j]==1? (int)pow(10,n-1-j): 0); } if ( !estet && i > 0){ testtab[i].push_back(1); } else if ( !estet) { testtab[i].push_back(0); } std::cout << "Serie I :"; for (int k =0; k < n; k ++){ std::cout< vec){ double max = vec[0]; unsigned int indMax=0; for(unsigned int i=0;imax){ max=vec[i]; indMax = i; } } return indMax; } /** * Récupération d'entrée dans un fichier * @method getInputUltime * @param fileName Nom du fichier * @param pourcentage Pourcentage à récuperer pour le training */ std::vector < std::vector > > getInputUltime(char const * fileName,float pourcentage){ /** * Counter */ std::ifstream in(fileName); std::string ligne; int nbLignes = 0; while(std::getline(in, ligne)){ nbLignes++; } in.close(); /** * Parser */ std::ifstream fichier(fileName, std::ios::in); if(fichier){ std::vector< std::vector > stock(nbLignes); // Tableau de chaine de caractère qui va contenir tout le fichier ligne par ligne std::cout << "\033[1;36m file " << "\033[1;31m" << fileName << "\033[1;36m opened with success , nbLignes= " <>ligne; std::stringstream ss(ligne); /** strinsplit à partir du caractère ',' */ while (getline(ss, s, ',')) { temp = atof(s.c_str()); stock[j].push_back(temp); // On stock chaque information dans une case } } swapVec(&stock); fichier.close(); int tailleTraining = (int)((pourcentage/100) * nbLignes); int tailleTesting = nbLignes - tailleTraining; std::vector< std::vector > > result(2); for(int i=0;i > > result(2); return result; } } /** * Affichage de l'architecture (cf. PYTHON) * @method displayArchi * @param info Vecteur d'information sur l'architecture */ void displayArchi(std::vector info){ std::string endline = "network.draw()"; std::string begin = "network = DrawNN( ["; std::string dyNeuron= " "; for (unsigned int i = 0; i <= info.size()-2; i++){ dyNeuron = std::to_string(info[i]) + ","; begin+=dyNeuron; } dyNeuron = std::to_string(info[info.size()-1]); begin += dyNeuron +"] )"; system("sed -i '$ d' Archi.py"); system("sed -i '$ d' Archi.py"); std::ofstream fichier("Archi.py", std::ios::app); if(fichier) { fichier<< begin <<"\n"; fichier< archi = (*Settings.getArchi()); std::cout << "Affichage de l'architecture du reseau, Fermez pour commencer" << std::endl; if(arch == true){ displayArchi(archi); } system("clear"); Reseau * rezo = new Reseau(archi.size(),archi,1.0,eta,fct); std::vector > > trainingettesting = getInputUltime(fileName,80); std::vector > training = trainingettesting[0]; std::vector > testing = trainingettesting[1]; int epoch = ep; std::vector res(Settings.getDifferentOutputs()->size()); int temp; std::vector > > testData(training.size()); std::cout<< "\033[1;33m"<size();k++){ std::vector mapVect(Settings.getDifferentOutputs()->size(),0); std::cout<<(*Settings.getDifferentOutputs())[k]<<" has been mapped to {" ; for(unsigned int z=0;zsize();j++){ if(temp==(*Settings.getDifferentOutputs())[j]){ res[j]=1; } else res[j]=0; } testData[i] = {training[i],res}; } std::cout << "Learning Starting..."< > expectedRes(testing.size()); for (unsigned int i = 0; i < testing.size(); i++){ temp=(int)testing[i][testing[i].size()-1]; for(unsigned int j=0;jsize();j++){ if(temp==(*Settings.getDifferentOutputs())[j]){ res[j]=1; } else res[j]=0; } expectedRes[i]=res; } std::vector result (Settings.getDifferentOutputs()->size()); int tmp = 0; int nberr = 0; int anciennenberr=0; for(int i=0;ilearn(testData,gradient); int deltat = time(NULL) - deb; if (auto_off) { tmp = 0; nberr = 0; anciennenberr=0; for(unsigned int i=0;ifire_all(testing[i]); std::vector print (Settings.getDifferentOutputs()->size(),0); print[findIndMax(result)]=1; anciennenberr=nberr; bool err = false; for(unsigned int l =0;l> " << (int)pourcentage << "% | " << i << " epoch | "<< deltat <<" secondes | Error "<< ((float)nberr/tmp)*100 <<"% \r"<< std::flush; if (((float)nberr/tmp)*100> " << (int)pourcentage << "% | " << i << " epoch | "<< deltat <<" secondes \r"<< std::flush; } } int delta = time(NULL)-deb; std::cout << "\r\033[1;36m 100% \033[0m"; std::cout << "<\033[1;33m DONE \033[0m> "<< std::endl; std::cout << "\033[1;36m Learning Completed \033[0m" << std::endl; std::cout << "Displaying last recorded weights..." << std::endl; rezo->printWeight(); tmp = 0; nberr = 0; anciennenberr=0; /** Nouveau test avec des valeurs inconnues pour le résaux neuronal */ for(unsigned int i=0;ifire_all(testing[i]); std::vector print (Settings.getDifferentOutputs()->size(),0); print[findIndMax(result)]=1; anciennenberr=nberr; bool err = false; for(unsigned int l =0;l anciennenberr){ std::cout<< "\033[1;31m /!\\"<<"\033[0m"; } std::cout<("<