Sieć neutronowa - rozpoznawanie cyfr

0

Zdaję sobie sprawę, że temat był wielokrotnie poruszany i jest wiele tutoriali na ten temat, jednak siedzę nad tym od trzech dni, kręcąc się w miejscu i nie ruszę dalej dopóki ktoś nie wytłumaczy mi gdzie leży błąd w moim rozumowaniu.

Próbuję napisać program, który rozpoznaje narysowane przez użytkownika cyfry. Próbowałam bezskutecznie implementować różne rozwiązania, ale nie potrafię przystosować ich do mojego problemu.

Na chwilę obecną ma gotowy interfejs pozwalający na narysowanie liczby, znajdujący obszar, na którym liczba została narysowana (obcina pustą górę, dół i boki), a następnie generujący wektor przedstawiający narysowany symbol. Siatka ma wymiary 3x6 (tymczasowo) więc wektor ma długość 18.
Wektor zawiera liczby 0 i 1 (1 = pole siatki zawiera część cyfry, 0 = pole znajduje się w miejscu, w którym nic nie zostało narysowane).
Czy 0 i 1 na wejściu sieci to dobre rozwiązanie? Większość implementacji wpuszczała na wejściu cyfry zmiennoprzecinkowe, ale nie mam pojęcia skąd one się biorą.

Zakładam, że jeżeli wektor zawiera 18 znaków, to wejście sieci powinno zawierać 18 neuronów (jeden dla każdej wartości). Ile warstw ukrytych?
Jak powinno wyglądać wyjście? Czy mogę założyć, że da się dostosować sieć tak by wypluła poprawne rozwiązanie w postaci jednej liczby (z zakresu 0-9), czy może wyjście powinno składać się z 10 neuronów, a znaleziona liczba zależy od tego, który jest aktywny?

Bardzo proszę o jakieś wskazówki, albo nakierowanie na poprawne rozwiązanie.

0

Czy 0 i 1 na wejściu sieci to dobre rozwiązanie?

Niektórzy implementują stopnie szarości, wtedy 0 - czarny, 1 - biały, 0.5 - szary, 0.75 - jasny szary i tak dalej. Lub na odwrót.

Większość implementacji wpuszczała na wejściu cyfry zmiennoprzecinkowe, ale nie mam pojęcia skąd one się biorą.

Ale rozumiesz jak w ogóle działa sieć neuronowa czy nie? Bo to zdanie oznajmia, że tak średnio.

Zakładam, że jeżeli wektor zawiera 18 znaków, to wejście sieci powinno zawierać 18 neuronów (jeden dla każdej wartości).

Jesteś w stanie na osiemnastu pikselach dokonać wyraźnej reprezentacji cyfr dziesiętnych?

Ile warstw ukrytych?

Zależy od budowy sieci, jedna powinna wystarczyć.

Jak powinno wyglądać wyjście?

No a co chcesz uzyskać na wyjściu?
Sieć ma dokonać klasyfikacji jaką cyfrą jest dany obrazek, zatem potrzebujesz 10 neuronów wyjściowych kolejno odpowiadających sklasyfikowaniu cyfry jako zero (gdy pierwszy najwyższą wartość na wyjściu), jako jeden (gdy drugi neuron ma najwyższą wartość) etc.

Czy mogę założyć, że da się dostosować sieć tak by wypluła poprawne rozwiązanie w postaci jednej liczby (z zakresu 0-9), czy może wyjście powinno składać się z 10 neuronów, a znaleziona liczba zależy od tego, który jest aktywny?

No powodzenia w tworzeniu sieci, której wyjście jest stosunkowo tak dużą liczbą. Większość sieci działa w zakresie <-1, 1> bądź <0, 1>.

Generalnie zapoznaj się z http://yann.lecun.com/exdb/mnist/ oraz jakąś sensowną książką na temat sieci neuronowych (neutronowe to masz gwiazdy).

0

Tak, sieć neuronowa. Wielkie dzięki za wytknięcie tego fundamentalnego błędu.

0

Generalnie 18 pikseli to stanowczo za mało. Kiedy robiłem swoją sieć do rozpoznawania liter miałem 12x12 = 144 piksele i dopiero cos mozna było ogarnąć, chociaz to i tak mało. Dopiero 30x30 dawało rozsądne wyniki no i mozna bylo rozpoznawac nowe zbiory.

Ode mnie: jeśli rozpoznawanie to zainteresuj się perceptronem wielowarstwowym (multilayer perceptron).

0
Patryk27 napisał(a):

Niektórzy implementują stopnie szarości, wtedy 0 - czarny, 1 - biały, 0.5 - szary, 0.75 - jasny szary i tak dalej. Lub na odwrót.

Na razie chcę to doprowadzić do działania w najprostszej postaci, więc linie mają ostre krawędzie (albo biały albo czarny).

Patryk27 napisał(a):

Ale rozumiesz jak w ogóle działa sieć neuronowa czy nie? Bo to zdanie oznajmia, że tak średnio.

Średnio, nie za bardzo rozumiem w jaki sposób warstwy mają ze sobą korespondować.

Patryk27 napisał(a):

Jesteś w stanie na osiemnastu pikselach dokonać wyraźnej reprezentacji cyfr dziesiętnych?

Nie. Takie rozwiązanie traktuję jako tymczasowe. Jedno wejście nie odpowiada dokładnie jednemu px, tylko zestawowi pikseli - przewaga koloru decyduje, czy pole jest białe, czy czarne.

Patryk27 napisał(a):

Zależy od budowy sieci, jedna powinna wystarczyć.

Gdzieś znalazłam wzór ukryte = sqrt(in*out)
Czyli trzymam się tego, że mam 13 na drugiej warstwie.

Patryk27 napisał(a):

No powodzenia w tworzeniu sieci, której wyjście jest stosunkowo tak dużą liczbą. Większość sieci działa w zakresie <-1, 1> bądź <0, 1>.

Więc 10 wyjść.

Czy mogę ograniczyć się do małej ilości wzorców? Np. jeden wzór dla jednej litery? Czy to da mi jakiś sensowny efekt?
Wydaje mi się, że przy tak małej ilości pól dodawanie dużej ilości wzorów, utrudniłoby rozróżnianie (przez to, że zniekształcone cyfry byłyby bardzo do siebie podobne).

0

Czy mogę ograniczyć się do małej ilości wzorców? Np. jeden wzór dla jednej litery? Czy to da mi jakiś sensowny efekt?

Pod żadnym pozorem.
Sieci neuronowe wymagają czasem milionów różnych zestawów danych... a Ty chcesz jeden na każdy znak?

Wydaje mi się, że przy tak małej ilości pól dodawanie dużej ilości wzorów, utrudniłoby rozróżnianie (przez to, że zniekształcone cyfry byłyby bardzo do siebie podobne).

Wydaje mi się, że człowiek miałby problem z sensownym rozpoznawaniem wzorów na tak małej przestrzeni, a co dopiero sieć.

0

Tutaj nie ma co kombinować tylko zbudować prostą sieć:

obrazek AxB pikseli = A*B neuronów wejściowych.
Eksperymenty na warstwie ukrytej = ilość neuronów w warstwie ukrytej (możesz użyć wzoru, który podałeś).
Na pewno 10 neuronów na wyjściu (w końcu 10 cyfr).

Ustawić połączenia między warstwami, wybrać funkcję aktywacji (sigmoid lub tangens hiberboliczny będzie odpowiedni) i algorytm uczenia (wsteczna propagacja).

Przygotować zestawy testowe (jeden to za mało, może przy 8-10 zacznie coś rozpoznawać, ale jw. czasami są miliony zestawów. Zresztą - w sieci można znaleźć gotowe datasety) i zacząć uczenie.

Najbardziej podstawowy plan. Polecam poszukać jakichś bibliotek do uzywanego języka, chyba że implementujesz to od zera to wtedy zaopatrz się w jakąś literaturę.

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