Sieć neuronowa

0

Mam problem ze zrozumieniem podstawowej kwestii jeżeli chodzi o sieci neuronowe. Złóżmy że mam 5 obrazów 20 x 20 px. Warstwa wejściowa to 400 neuronów, pomijam warstwę ukrytą i przechodzę do wyjściowej w której siła rzeczy będzie się znajdować 5 neuronów bo chcę rozpoznawać właśnie te 5 obrazów. I teraz mój problem. W jaki sposób nauczyć sieć że pierwszy obraz ma aktywować po nauce pierwszy neuron wyjścia, drugi obraz drugi itd ? W przypadku jednego neuronu na wyjściu sprawa jest prosta. Jeżeli chce rozpoznać obraz A to sieć będzie się w taki sposób uczyć aby neuron w rezultacie dawał -1 a obraz B +1. A jak wygląda to w przypadku 5 obrazów i 5 wyjść ?

0
wilku09 napisał(a)

W jaki sposób nauczyć sieć że pierwszy obraz ma aktywować po nauce pierwszy neuron wyjścia, drugi obraz drugi itd ?

Zdaje się, że problem był już kilka razy poruszany a poprzednio dość szczegółowo go opisałem - dość rozlegle :P.
Problem jest w miarę logiczny i prosty chociaż w praktyce różnie to bywa :).
Gdy masz wektor danych uczących (tzn. te obrazki w postaci binarnej/minus jeden - jedynkowej ^^) tzn. gdy rozważasz pierwszy obrazek to dajesz 1 dla pierwszego neurona i -1/0 dla reszty neuronów. Następnie, gdy rozważasz drugi obrazek/klasę to pierwszemu obrazkowi odpowiada -1/0, drugiemu 1 i pozostałym znowu -1/0 (-1 i 0 zależy jaką funkcję aktywacji sobie wybierzesz). Wówczas, gdy nauczysz już tak sieć i podasz jakiś nowy obrazek do sieci to neuron, który zwróci największą wartość oznacza, że obrazek należy właśnie do tej klasy. Przykładowo, jak wprowadzisz nowy obrazek do sieci (tzn. w postaci tych 400 zmiennych) i twoje 5 neuronów zwróci np. takie wartości: wynik = {-0.2, 0.7, 0.85, -0.8, 0.15} to znaczy, że obrazek należy do 3 klasy (wynik jest 0.85 tzn. najwyższy - prawdopodobieństwo jest wówczas największe właśnie dla tej klasy).
Jeśli jeszcze czegoś nie rozumiesz to weź poszukaj tutaj na forum podobnego wątku -> z tego co pamiętam podawałem również przykłady jak to ma/może wyglądać.
Pozdawiam

0

Czesc,

wlasnie zaczynam projekt z sieciami neuronowymi.Temat jest raczej prosty dla programistow,ale dla mnie nie. Chodzi o rozpoznawanie znakow alfabetu. Chcę napisac program w C. Chciałbym wczytywac zeskanowane litery do programu. Rozumiem,że najpierw muszę zamienic jakoś te obrazy ze skanera na postac liczbową.Czy kilkakrotnie muszę np. tę samą literę skanować ,ale inaczej trochę zapisaną aby potem nauczyć siec? Poza tym nie wiem jaka jest najlepsza siec do tego ,tzn.jak f.aktywacji i czy kohonena czy jakaś inna. Może ktoś robił taki projekt i może napisać kilka wskazówek? Nie korzystam z programu NN w matlabie. Chciałbym napisać wlasny kod.

0

Problem z rozpoznawaniem znaków jest taki, że zwykła sieć trójwarstwowa sobie z tym nie radzi - małe odchyłki, przechylenia, niewielkie zmiany wielkości - wszystko to powoduje, że nie da się jej nauczyć rozpoznawania pisma.

Do tego musisz użyć bardziej rozbudowanej sieci - tzw. CNN ( Convolutional Neural Network)

Tutaj masz więcej o tym: http://www.codeproject.com/KB/library/NeuralNetRecognition.aspx#ConvolutionalStructure

Jeśli nie znasz podstaw, nie radzę brać się od razu za CNN i rozpoznawanie pisma. Ta sieć różni się znacznie od typowej sieci, gdzie wszystkie neurony warstwy poprzedniej łączą się ze wszystkimi neuronami warstwy kolejnej. Jest to o wiele bardziej skomplikowana sieć z relatywnie dużą liczbą neuronów i innymi smaczkami (jak np. wspólne wagi).

Tak więc radzę zacząć od czegoś prostszego.. :)

0

Chodzi mi o rozpoznawanie pojedynczych liter po napisaniu w okienku gui programu. Czyli myszką rysujemy literę ,a siec rozpoznaje co to za litera.

// chodziło mi również o pojedyncze litery - deti

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