Dziedziczenie i parę inncyh

0

Witam
Wspominałem już w innym wątku że buduje sieć neuronową a po drodze trafiam na przeszkody jako że nie jestem obyty z językiem, a więc:
Mam klasy:Neuron z zagnieżdzoną klasą Wejscia i klase Siec , sercem klasy Sieć jest :

 vector<vector<Neuron> > warstwy ;

plus metody, więc pomyślałem że zamiast tego było by dobrze odziedziczyć vector i dodać metody : I tu napotykam problemy:
1.Kiedy chce dziedziczyć po vectorze dostaje komunikat: "6 "expected class-name before '{' token "
2.Gdy już uda mi się wykonać punkt wyżej to będę tworzył sieć poprzez:

Siec<vector<Neuron> warstwy 

, a chciałbym tworzyć obiekty jako instancje klasy Siec "Siec warstwy" i żeby te warstwy były już tymi dwuwymiarowymi wektorami jak po konstrukcji vector<vector<Neuron> > warstwy ;

 bo w tej chwili musze stworzyc w main obiekt klasy Siec w której powstaje  ten vector vectorow so sprawia ze instrukcje staja sie przy dlugie bo musze pisac obiekt.warstwy  zamiast odwolywac sie bezposrednio np. warstwy[0][0], i nie chciał bym tego rozwiązać poprzez typedef choćby ze względów dydaktycznych żeby się czegoś nauczyć.
Witam
Wspominałem już w innym wątku że buduje sieć neuronową a po drodze trafiam na przeszkody jako że nie jestem obyty z językiem, a więc:
Mam klasy :Neuron z zagnieżdżoną klasą Wejścia i klasę Siec (tu przechowuje obiekty Neuron), sercem klasy Sieć jest :
```cpp
 vector<vector<Neuron> > warstwy ;

plus metody, więc pomyślałem że zamiast tego było by dobrze odziedziczyć vector i dodać metody : I tu napotykam problemy:
1.Kiedy chce dziedziczyć po vectorze dostaje komunikat: "6 "expected class-name before '{' token "
2.Gdy już uda mi się wykonać punkt wyżej to będę tworzył sieć poprzez:

Siec<vector<Neuron> warstwy 

, a chciałbym tworzyć obiekty jako instancje klasy Siec "Siec warstwy" i żeby te warstwy były już tymi dwuwymiarowymi wektorami jak po konstrukcji vector<vector<Neuron> > warstwy ;

 bo w tej chwili musze stworzyć w main obiekt klasy Siec w której powstaje  ten vector vectorow co sprawia ze instrukcje staja się przy długie bo musze pisać obiekt.warstwy  zamiast odwoływać się bezpośrednio np. warstwy[0][0] gdyby warstwy były bezpośrednio obiektem klasy Siec, i nie chciał bym tego rozwiązać poprzez typedef choćby ze względów dydaktycznych żeby się czegoś nauczyć.

Mam też problem z klasa Wejścia która jest zagnieżdżona w klasie Neuron chciałbym abym mógł napisać 
```cpp
 web->warstwy[0][0].wejscia[0].set(1)

przy czym web to obiekt klasy Siec z vektorami vektorow w postaci warstwy, więc odnoszę się do pierwszego neurony pierwszej warstwy by pierwsze wejścia było ustawione jako i tu właśnie chodzi mi o metodę set, bo chciałbym przesyłać jedynie int z numerem neuronu(neurony numeruje) w metodzie set odpowiedni neuron byłby odnaleziony i jego wyjście było by przypisane do danego wejśćia neuronu na rzecz którego ta metoda została wywołana , a problem leży w tym że w klasie Wejście nie mam dostępu do tego wektoru wektorów z neuronami w srodku z Klasy siec, i pytanie brzmi czy istnieje jakiś sposób bym miał dostęp do powstałego juz wektoru wektorów z klasy siec w klasie Wejście bez przesyłania obiektu klasy Siec z tym wektorem przez argument metody.

Mam też problem z klasa Wejscia ktora jest zagnieżdzona w klasie Neuron chciałbym abym mogl napisac

 web->warstwy[0][0].wejscia[0].set(1)

przy czym web to obiekt klasy Siec z vektorami vektorow w postaci warstwy, więc odnoszę się do pierwszego neurony pierwszej warstwy by pierwsze wejscia bylo ustawione jako i tu wlasnie chodzi mi o metode set, bo chcialbym przesylac jedynie int z numerem neuronu(neurony numeruje) w metodzie set odpowiedni neuron bylby odnaleziony i jego wyjście było by przypisane do danego wejśćia neuronu na rzecz którego ta metoda została wywołana , a problem leży w tym że w klasie Wejscie niemam dostepu do tego wektoru wektorow z neuronami w srodku z Klasy siec, i pytanie brzmi czy istnieje jakis sposob bym mial dostep do powstalego juz wektoru wektorow z klasy siec w klasie Wejscie bez pprzesylania obiektu klasy Siec z tym wektorem przez argument metody.

0

O ile dobrze pamiętam nie możesz dziedziczyć po szablonie ogólnie, tylko po jego instancji (np. vector<Neuron>). Ogólnie mi się wydaje, że po prostu za bardzo kombinujesz. Najprościej jest przedstawiać warstwy neuronów jako tablice wag np. double lub float (typedef jest Twoim przyjacielem). Dzięki temu (bez stosowania dodatkowych klas) możesz używać jakieś biblioteki do obliczeń numerycznych. Odpowiednio rozmieszczając tablicę w pamięci możesz np. użyć lepszych funkcji optymalizacyjnych (niż metoda najmniejszego spadku) bez niepotrzebnego przystosowywania danych i odbierania wyników.

Ogólnie to obiektowo bym zrobił interfejs sieci, wewnętrzne działanie to będzie zbędna komplikacja, utrudniająca ewentualną wektoryzację obliczeń (a np. wsteczna propagacja dość wolno uczy sieć). Moje porady odnoszą się oczywiście do prostych sieci, bez jakiś sprzężeń zwrotnych itp. (bo o tym niestety mam bardzo średnie pojęcie). Celem abstrakcji, min. programowania obiektowego, jest uproszczenie kodu, a wydaje mi się, że w tym wypadku niepotrzebnie próbujesz go skomplikować.

Ja bym na przykład dał ogólną metodę output, która by pobierała wejście w postaci tablicy wejść i wyjscie do wpisania, także w postaci tablicy. Uczenie podobnie, tablica tablic wejść i tablica tablic oczekiwanych wyjść oraz np. ilość iteracji. Robienie specjalnych klas do wejścia i wyjścia jest bez sensu. Możesz też rozszerzyć klasę sieci neuronowych o możliwość zdefiniowania funkcji oraz jej pochodnej, działających na tablicach, choć tracisz wtedy zysk z liczenia pochodnej dla prostej funkcji sigmoidalnej (1/(1+exp(-x)). Da się to rozwiązać przez szablon przyjmujący funkcję jako parametr i specyfikację tego przypadku szczególnego dla tej funkcji.

0

Ok, więc zmieniam pytanie :

 
#include <cstdlib>
#include <iostream>
#include <vector>

class Siec;
using namespace std;
class Perceptron{
     public:  
    
     signed int out;
     static int licznik;
     int nr;
     int n_in;
     signed int prog;
     vector<vector<int> > ins;
     
     Perceptron(){
                  cout << "Konstruktor domyslny perceptronu: "<< nr <<endl;              
                }
     Perceptron(int Ilosc_In){
               ins.resize(Ilosc_In);
               for(int i =0;i<Ilosc_In;i++){ins[i].resize(2);}
               prog = 0;     
               n_in = Ilosc_In;
               nr = licznik; //Numeracja perceptronów
               licznik++;     
               cout << "Konstruktor argumentowy perceptronu: " << nr  <<endl;
               cout << "Ilosc wejsc: " << Ilosc_In <<endl;
               }
     Perceptron(const Perceptron& a){
                cout << "Konstruktor kopiujacy Perceptron" << endl;
                     
                }//Koniec Konstruktora kopiującego
     
     void get_nr(){
          cout << "Perceptron nr: "  << nr << " " << endl ;
           }  
     void get_info(){
          cout<< "-----------------INFO-----------------"<<endl;
          cout << "Perceptron numer: "<< nr <<endl;
          cout << "Ilosc wejsc: "<<n_in<<endl;
          }
     void set(int in,Siec& s,int n){
           s.layers[0][0].get_info();
          }
     void ex_out(){
          } //Koniec ex_out
        
    
       };//Koniec klasy perceptron
 int Perceptron::licznik=1;

struct Siec {
      public:
       int l_warstw;
       vector<vector<Perceptron> > layers ;

       Siec(int l_w){
            layers.resize(l_w);
            cout <<"Siec stworzona"<<endl;
               }    
       void set_layer(int w,int l_kom){
            layers[w].resize(l_kom);
            cout << "STWORZONY WEKTOR MA WIELKOSC !!! " << layers[w].size()<<endl;
            }
       void put(Perceptron a,int lay,int pos){
            layers[lay][pos] = a;            
            }
       int  size(){
            return layers.size();
            }
       void trenuj(){
            
            } 
    
       };//Koniec sieci
int main(int argc, char *argv[])
{   
       
    Siec web = Siec(2);
    web.set_layer(0,2);
    web.set_layer(1,1);
    web.put(Perceptron(2),0,0);
    web.put(Perceptron(2),0,1);
    web.put(Perceptron(2),1,0);
    web.layers[1][0].set(0,web,1); //O tą funkcję się rozchodzi
      
    system("PAUSE");
    return EXIT_SUCCESS;
}


Chcialbym wysłać do set z klasy Perceptron, numer wejścia na ktore ma zostaś przypisana wartość ,odnośnik do sieci żebym mógl sie po niej poruszac w tej metodzie i numer Perceptronu z którego wyjście ma sie stac wejściem Perceptronu(wejscie,siec,perceptron) na rzecz którego wywołałem funkcję , ale program się nie kompiluje myślałem że deklaracja zapowiadająca rozwiąże problem ale jednak nie rozwiązała. Co teraz?? Błędy zobaczycie jak wrzucicie do swojich kompilatorów , będę wielce rad za chęć pomocy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1