hej ,ostatnio zainteresowałem się sztucznymi sieciami neuronalnymi :) wiem że to dość skomplikowany temat i znając tylko "podstawy podstaw w c++" lepiej się za to nie brać ... na razie oczywiście nie biorę się za takie rzeczy jak wsteczna propagacja błędów czy sieć rekurencyjna . Miałem na celu napisać symulator działania prostego pojedynczego neuronu . Zastosowałem wagi ,sumator ,oraz funkcje aktywacji neuronu . Poza tym w programiku możemy tworzyć nowe synapsy i dendryty oraz nadawać im wartości . Co wy o nim sądzicie ? ,program nie jest w 100% mojego pomysłu bo kod sztucznego neuronu znalazłem w Javie - http://patrykkobielak.pl/java-sztuczny-neuron/ .Program jednak zmodyfikowałem i dodałem symulator . Jeżeli neuron zapisałem poprawnie to mam kilka pytań ...
1) Czy tworząc nowy neuron muszę też napisać nową klasę czy bardziej będzie to polegać na metodach prędzej rekurencyjnych czy zmienianiu wartości konstruktora itd ...
2) Czy poprawnie zastosowałem wzór na funkcje aktywacyjną unipolarną
3) Po co przenosić sumę potencjału membranowego na funkcje i wyliczać ostateczną wartość ?
Pod spodem podałem kod programu ,będę wdzięczy za jego ocenę i rady ,pozdrawiam :)
#include <iostream> #include <vector> #include <conio.h> #include <windows.h> #include <cstdlib> using namespace std; /// KLASA NEURONU /// class Neurone { private: vector<double>dendrites; //WEJŚCIA vector<double>synapses; //WAGI public: void create_elements(int n) //TWORZYMY ZADANĄ LICZBĘ WAG I WEJŚĆ Z POCZĄTKOWĄ WARTOŚCIĄ 0 { for(int i=0; i<n; i++) { dendrites.push_back(0); synapses.push_back(0); } } void create_new_element_of_dendrites() //TWORZENIE NOWEGO DENDRYTU DO SYMULATORA { dendrites.push_back(0); } void create_new_element_of_synapses() //TWORZENIE NOWEJ SYNAPSY DO SYMULATORA { synapses.push_back(0); } double membranePotential(double membrane_potential) //ZWRACA POTENCIAŁ MEMBRANOWY { return membrane_potential; } int input_size() //ZWRACA ILOŚĆ DENDRYT(WEJŚĆ DO NEURONU) { return dendrites.size(); } double get_input(int index) //ZWRACA WARTOŚĆ WYBRANEGO NUMERU WEJŚCIA { return dendrites[index]; } void set_input(int index, double value) //USTAWIA WARTOŚĆ WYBRANEGO NUMERU WEJŚCIA { dendrites[index]=value; } double get_synapses(int index) //ZWRACA WARTOŚĆ WYBRANEJ WAGI { return synapses[index]; } void set_synapses(int index, double value) //USTAWIA WARTOŚĆ WYBRANEJ WAGI { synapses[index]=value; } double processCell(int index) //MNOŻENIE ODPOWIEDNIEJ DENDRYTY PRZES ODPOWIADAJĄCĄ JEJ WAGĘ { return dendrites[index]*synapses[index]; } double getMembranePotential() //OBLICZANIE SUMY MEMBRANOWEJ { if(input_size()==0) //JEŚLI WEJŚCIA NIE ISTNIEJĄ return -1; else { double sum=0; for(int i=0; i<input_size(); i++) { sum+=processCell(i); } return sum; } } long double power(int p) //POTĘGOWANIE NIEZBĘDNE DO WLICZNIA FUNKCJI AKTYWACJI UNIPOLARNEJ { const double w = getMembranePotential(); double n = 1; for(int i=0; i<w; i++) { n*=p; } long double x = getMembranePotential()/n; //BO POTENGUJEMY PRZEZ -5 WIĘDZ DZIELIMY return x; } double function_use() //FUNKCJA AKTYWACJI { if(input_size()==0) //JEŚLI WEJŚCIA NIE ISTNIEJĄ return -1; else { float e = 2.71; //WARTOŚĆ LOGARYTMU float f = (1/(1+(power(e)))); //AKTYWACJA UNIPOLARNA return f; } } }; /// KONIEC KLASY NEURONU /// Neurone neurone; void get_information() { double value_of_neurone = neurone.function_use(); for(int i=0; i<neurone.input_size(); i++) { cout<<i+1<<" input : dendrites = "<<neurone.get_input(i)<<" synapses = "<<neurone.get_synapses(i)<<endl; } cout<<endl; cout<<"NEURONE OUTPUT = "<<neurone.function_use()<<endl; cout<<"DENDRITES POTENTIAL OUTPUT = "<<neurone.getMembranePotential()<<endl; cout<<endl<<endl; } int main() { cout<<"---NEURAL CELL---"<<endl; getch(); while(true) { system("cls"); get_information(); cout<<" ---MENU--- "<<endl<<endl; cout<<"1) create new dendrites and synapses"<<endl; cout<<"2) change dendrites value "<<endl; cout<<"3) change synapses value "<<endl; cout<<"4) exit "<<endl; char z = getch(); switch(z) { case '1': { neurone.create_new_element_of_dendrites(); neurone.create_new_element_of_synapses(); } break; case '2': { cout<<endl; int index; double value; cout<<"enter the dendrites (input) value : "; cin>>value; cout<<"enter the dendrites (input) index : "; cin>>index; neurone.set_input(index-1,value); } break; case '3': { cout<<endl; int index; double value; cout<<"enter the synapses value : "; cin>>value; cout<<"enter the synapses index : "; cin>>index; neurone.set_synapses(index-1,value); } break; case '4': { exit(0); } break; } } return 0; }