Neuron McCullocha-Pittsa

0

Mam zadanie zaimplementować taki neuron. Dostaje on sygnaly w takiej postaci na wejsciu :

101010101010
001010101001
010101101011

dostaje tez wartosc progrowa i wagi :

7 - wart progrowa
1
2
5

i algorytm rozumiem, tylko nie wiem, jak czytac te dane - czy czytać je kolumnami czyli np. 11+02+05, (to mam jedno załatwione) potem druga kolumna z we, czyli : 01+02+15, czy może wierszami ? Tylko wtedy nie wystarczy mi tych "wag" ...

Czyli dla przykladu powyzej mialbym taki algorytm :

for(int i=0; i<3; i++)
    {
     int wynik = 0;
     for(int j=0; j<3.size(); j++)
     {
      wynik += wagi[j] * wejscie[i][j];
     }
     if(wynik-wartosc_progowa >= 0)
        cout << "1";
     else
        cout << "0";
    }

... tylko nie wiem, czy dobrze mysle ... Prosze o podpowiedz:)

0

A moze mnozyc to w taki sposob?

101010101010
001010101001
010101101011
1
2
5

11+01+11+01+11+01+11+01+11+01+11+01 (czyli caly pierwszy wiersz przez pierwsza wage?

i dalej, drugi wiersz przez druga wage, trzeci przez trzecia ...

0

a może to są trzy zmienne zapisane binarnie? :]
Trochę się w to bawiłem ale powiem szczerze, że to zadanie jest przynajmniej dziwne. Może napisz dokładną treść zadania bo chyba coś namieszałeś tutaj...

0

Ogólnie to mam zaimplementowac ten neuron, gdzie podane ciągi są wejściowymi impulsami. Wszędzie gdzie czytałem, na wejściu powinna być pojedyncza liczba, a nie taki ciąg zerojedynkowy, bo gdyby tak było, nie byłoby problemu, ponieważ w przypadku czegoś takiego:

to moje wejscie:

1
2
2

to moje wagi:

3
2
4

to moja wartosc progowa:
3

Zrobiłbym tak : 13+22+2*4-3 i spr czy to jest większe równe zero.

Jednak w tym przypadku też mam problem z interpretacją wejścia, dlatego pomyślałem, aby kolejne kolumny mojego wejścia (ciągów zer i jedynek) - brac z nich po kolei koluumny i tak jak wyżej opisałem, mnożyć przez wagi - nie wiem tylko, czy to ma sens ;)

0

Witam

Z tego co pamiętam to każdy wiersz jest wektorem wejściowym twojej sieci (masz trzy takie wektory). Ilość danych w każdym wektorze jest podzielna przez trzy i masz trzy wagi w swoim neuronie.
Podając kolejno na wejścia neuronu "x1=1, x2=0, x3=1" analogicznie dla pozostałej części twojego wektora "010" potem "101" w końcu "010" otrzymasz wektor wyjściowy składający się z czterech elementów.
I tak kolejno dla wszystkich wektorów wejściowych.

Pozdrawiam

0

A mógłbyś może (jeśli to dla Ciebie nie problem) rozpisać to np dla danych podanych przeze mnie ? (Lub jakichś innych), bo dalej nie bardzo rozumiem, jak to ma wyglądać :( dzięki ;)

0

Tak jak pisałem wcześniej masz trzy wektory wejściowe. pierwszym z nich jest "101010101010"
Ten sam wektor rozpisany na "porcje" które podajesz na wejścia swojego neuronu: "101" "010" "101" "010"
Cztery razy musisz użyć swojego neuronu żeby przerobić pierwszy wektor:
Wartość progowa neuronu = 7
Dla pierwszej porcji danych: "101"
11 + 02 + 1*5 = 6 // mniejsze od wartości progowej czyli na wyjściu 0

Druga porcja danych: "010"
01 + 12 + 0*5 = 2 // mniejsze od wartości progowej czyli na wyjściu 0

Trzecia porcja danych: "101"
11 + 02 + 1*5 = 6 // mniejsze od wartości progowej czyli na wyjściu 0

Czwarta porcja danych: "010"
01 + 12 + 0*5 = 2 // mniejsze od wartości progowej czyli na wyjściu 0

Podając do neuronu wektor wejściowy w postaci "101010101010" otrzymałeś wektor wyjściowy "0000"
Przy założeniu że wartość progowa równa 7 a wagi 1, 2, 5

Nie wiem jak to jaśniej opisać.

0
emilios8 napisał(a)

Z tego co pamiętam to każdy wiersz jest wektorem wejściowym twojej sieci (masz trzy takie wektory).

A skąd założenie, że wiersz a nie kolumna jest wektorem wejściowym? Przecież to zależy tylko i wyłącznie od nas jak to sobie zorganizujemy... czy będzie to wektor W czy W^T (transponowany) to nie ma większego znaczenia... Bliższy jestem tezie, że należy wprowadzić kolumny bo inaczej zadanie robi się przynajmniej dziwne (dzielić wektor na 3 części i po kawałku wrzucać do "neuronów" -> LoL).
Jeśli w zadaniu nie ma nic o dzieleniu tego wektora na części to szukałbym innego rozwiązania...
Pozdrawiam

0

sfs:

A skąd założenie, że wiersz a nie kolumna jest wektorem wejściowym?

Zazwyczaj wiersze macierzy danych wejściowych są jakimiś wzorcami na które sieć reaguje. Na przykład mapa bitowa 3x4:

101
101
101
010 // Prymitywna litera U

Z takiej mapy otrzymam wektor 101101101010 który reprezentuje właśnie literę U i stąd założenie że wektory a nie kolumny.
Ma to związek z uczeniem sieci jakiegoś wzorca który później ma rozpoznać. Podając kolumny do neuronu sieć uczyłaby się danymi z różnych wzorców.
Nie widzę sensu transponowania macierzy wejściowej. Po takiej operacji otrzymałby całkiem inne dane wejściowe. (Reprezentujące jakieś inne wzorce "litery")
Jeżeli ma do dyspozycji tylko jeden neuron z trzema wejściami to moim zdaniem powinien cyklicznie podawać kawałki wektora wejściowego aż do jego końca.
Dla jego danych wejściowych użyłbym sieci/neuronu z 12 wejściami

Do poduszki polecam:
http://www.edward_ch.republika.pl/pod_prakt.html

BTW. ralf powinien wiedzieć z zajęć jak interpretować swoje dane wejściowe i co one reprezentują.

Pozdrawiam

0
emilios8 napisał(a)

sfs:
A skąd założenie, że wiersz a nie kolumna jest wektorem wejściowym?

Zazwyczaj wiersze macierzy danych wejściowych są jakimiś wzorcami na które sieć reaguje. Na przykład mapa bitowa 3x4:
101
101
101
010 // Prymitywna litera U
Z takiej mapy otrzymam wektor 101101101010 który reprezentuje właśnie literę U i stąd założenie że wektory a nie kolumny.
Ma to związek z uczeniem sieci jakiegoś wzorca który później ma rozpoznać. Podając kolumny do neuronu sieć uczyłaby się danymi z różnych wzorców.

Sorry, ale gadasz brednie! Szczególnie to ostatnie zdanie - ponowne założenie wzięte z kosmosu.
To czy wrzucimy do siedzi dane w postaci: 101101101010 czy 111000011110 czy np. 111111100000 nie ma największego znaczenia -> oczywiście pod warunkiem, że wiesz za co dana zmienna odpowiada. Możesz sobie zamienić tą Twoją tablicę losowo w wektor -> tylko później musisz uwzględnić tą samą kolejność w dalszej części programu... Czyli jeśli założysz, że wektor będzie się zaczynał od środkowego elementu tej tablicy to wszędzie musisz tak robić (dla pozostałych zmiennych).
Akurat dane wzorcowe mają tutaj najmniej do gadania. Jak uczysz sieć to nie porównujesz każdej danej wejściowej z tą samą daną we wzorcu, tylko na wyjściu masz ilość wszystkich wzorców a na wejściu np. jakąś tablicę zmiennych (wyjątkiem są sieci autoasocjacyjne, ale to raczej inna bajka). Trochę namieszałem ale chodzi o to (na Twoim przykładzie), że jak na wejściu masz tą Twoją tablicę z 12 elementami to na wyjściu możesz mieć 25 neurony (odpowiadające za każdą literę alfabetu) a możesz mieć np. tylko 3 neurony odpowiadające jakiemuś innemu zadaniu. Uwierz mi, że kolejność nie ma znaczenia jak konsekwentnie stosujesz pewien klucz.
Natomiast sama idea, żeby z powodu braku wag wrzucać wektor zmiennych "po kawałku" jest wręcz śmieszny. Nie ma w ogóle takiej opcji, żeby zabrakło wag... Jak decydujesz się na 3 zmienne wejściowe to tyle masz wrzucać do sieci (one reprezentują cały wzorzec), jak znajdziesz jakąś inną, dodatkową daną to zwiększasz ten wektor i uczysz sieć od nowa.
Ja bardziej obstawiam, że to co autor przedstawił to jest po prostu macierz zmiennych z czego i-ta zmienna w wierszu odpowiada i-temu wzorcowi -> mamy 12 danych uczących, każda po 3 zmienne.

Podając kolumny do neuronu sieć uczyłaby się danymi z różnych wzorców
że co? Niestety nie rozumiem o czym Ty mówisz...

Nie widzę sensu transponowania macierzy wejściowej. Po takiej operacji otrzymałby całkiem inne dane wejściowe. (Reprezentujące jakieś inne wzorce "litery")
i znowu... Jak niby otrzymam coś innego?! Przecież jak tworzysz z macierzy XxY wektor o długości X*Y to już (patrząc z Twojego punktu widzenia) masz "całkiem inne dane". Więc co za różnica, czy sobie ułożysz je od góry do dołu czy od lewego do prawego?

Jeżeli ma do dyspozycji tylko jeden neuron z trzema wejściami to moim zdaniem powinien cyklicznie podawać kawałki wektora wejściowego aż do jego końca.

kolejne "że co?"... Po pierwsze nikt nie powiedział (nie potwierdził), że długość tych danych reprezentuje jeden wzorzec (przynajmniej ja tak zrozumiałem dylemat autora). Nie wiadomo, czy jeden zestaw wejściowy to są kolumny czy części wierszy czy jeszcze inaczej... Jeśli części wierszy to gratuluję autorowi zadania - chyba za dużo osób u niego zdaje więc robi ludziom kisiel z mózgu. Jeśli zadanie jest dokładnie takie jak autor przedstawił to z niego w sumie nic nie wynika... W zadaniu powinno być jasno wskazane, które dane co reprezentują (za co odpowiadają).
Ja obstawiałbym, biorąc pod uwagę niejasność zadania, tak jak autor postu, że dane wejściowe są tylko 3 - tyle jest wag i nic się tu nie zmieni. Natomiast pozostałe kolumny odpowiadają kolejnym danym uczącym.

BTW. ralf powinien wiedzieć z zajęć jak interpretować swoje dane wejściowe i co one reprezentują.
Taa, tu się zgodzę :)

Pozdrawiam

0

zaraz sobie poczytam to, co napisaliście, niestety mam właśnie problem z poprawną interpretacją, bo nie było mnie na zajęciach i wiem tylko tyle, co koledzy przekazali ;)

0

Aha, mam informację jeszcze dodatkową, że jeden wiersz = jeden sygnał. Czy to coś zmienia?

0

ralf
Aha, mam informację jeszcze dodatkową, że jeden wiersz = jeden sygnał. Czy to coś zmienia?

To potwierdza to co napisałem wcześniej.

0
emilios8 napisał(a)

ralf
Aha, mam informację jeszcze dodatkową, że jeden wiersz = jeden sygnał. Czy to coś zmienia?

To potwierdza to co napisałem wcześniej.

A ja to np. rozumie jako jedną zmienną => każda kolumna odpowiada innej danej wzorcowej => wiersz to k-próbek, które po kolei wrzucamy do sieci, żeby ją nauczyć

0

O jejku już mi się wszystko pomieszało :( Najlepiej zrobię to na 2 sposoby, o których obaj mówicie - jednek program innym sposobem, drugi innym. Chociaż tak szczerze to jakoś do mnie bardziej przemawia wersja użytkownika emilios8, chociaż mówię od razu, że to tak tylko "na czuja" ;)

0
emilios8 napisał(a)

Tak jak pisałem wcześniej masz trzy wektory wejściowe. pierwszym z nich jest "101010101010"
Ten sam wektor rozpisany na "porcje" które podajesz na wejścia swojego neuronu: "101" "010" "101" "010"
Cztery razy musisz użyć swojego neuronu żeby przerobić pierwszy wektor:
Wartość progowa neuronu = 7
Dla pierwszej porcji danych: "101"
11 + 02 + 1*5 = 6 // mniejsze od wartości progowej czyli na wyjściu 0

Druga porcja danych: "010"
01 + 12 + 0*5 = 2 // mniejsze od wartości progowej czyli na wyjściu 0

Trzecia porcja danych: "101"
11 + 02 + 1*5 = 6 // mniejsze od wartości progowej czyli na wyjściu 0

Czwarta porcja danych: "010"
01 + 12 + 0*5 = 2 // mniejsze od wartości progowej czyli na wyjściu 0

Podając do neuronu wektor wejściowy w postaci "101010101010" otrzymałeś wektor wyjściowy "0000"
Przy założeniu że wartość progowa równa 7 a wagi 1, 2, 5

Nie wiem jak to jaśniej opisać.

Nie wiem w jaki sposób, ale dopiero teraz zauważyłem tą Twoją odpowiedź :) Dokładnie tak to sobie wyobrażałem, jak zacząłeś to tłumaczyć. Mam jeszcze jedno pytanie - czy to jest zgodne z wzorem podanym na wiki? Bo ja bym tu dał tylko jedną modyfikację. Mianowicie np. jeśli dla 3-iej porcji danych po wymnożeniu przez wagi wychodzi mi 6, to muszę jeszcze odjąć od tego tę wartość progową i dopiero ten wynik porównywać z zerem :) I wszystko byłoby już ok - tu jest wzór z wiki : http://pl.wikipedia.org/wiki/Neuron_McCullocha-Pittsa

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