Autor Wątek: Sieci neuronowe: XOR i Sieć na bitmapie  (Przeczytany 2652 razy)

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Wrzesień 23, 2015, 12:31:38
Chciałbym się dowiedzieć czy:

1) Ile iteracji uczenia powinno być maksymalne (pi razy drzwi) przy uczeniu sieci XOR-a?

2) Czy lepsza dla XOR jest sieć z dwoma neuronami w warstwie ukrytej + bias (2-2-1), czy też z trzema w ukrytej bez biasu (2-3-1)?

3) Czy można jakoś utrwalić nauczoną sieć neuronową w mniej pamięciożernej postaci? Chodzi mi o to , że załóżmy, że chcę sieć która przetwarza jedną bitmapę w drugą. To wejść mam dla obrazka wielkości 100x100px dokładnie 10 tyś, nie mówiąc już o liczbie połączeń do warstwy ukrytej (i pamiętać trzeba wagi każdego połączenia). Więc chyba nie ma sensu trzymać takiej całej sieci w środowisku produkcyjnym?.

Z góry dzięki za pomoc.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline koirat

  • Użytkownik

# Wrzesień 23, 2015, 18:08:06
1) to nie jest dobre pytanie. Wszystko zależy od tego jak ci się wagi na początku wylosują i jak bardzo trafiłeś z parametrami uczącymi, oraz jak bardzo nauczona my być ta sieć. Zakładam że mówimy o Backpropagacji. Na oko powiedział bym że kilkadziesiąt iteracji, ale mogłem się pomylić o +- tysiąc.

2) lepsza jest  (2-1-1) z tym że neurony z warstwy wejściowej połączone są dodatkowo z ostatnim neuronem. Bias jest częścią idei perceptronu, to nie przypadek że on tam jest więc lepiej zawsze dawaj.

3) Zacznijmy od tego że raczej nie uda ci się w przystępnym czasie nauczyć takiej sieci neuronowej więc lepiej wymyśl czym ją karmisz bo piksele mogą nie być najlepszą decyzją.

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Wrzesień 23, 2015, 18:20:22
Właśnie zauważyłem, że chyba dużo (chyba bardzo), zależy od wag jakie się wylosują. Udaje mi się nauczyć XOR-a w około 1000 iteracji, bias zaczynam od 0.6, przy każdej iteracji mnożę go razy 0.999. Mam funkcję tangensa hiperbolicznego i sygnały w [-1;1]. Nie udaje się nauczyć tak statystycznie w 1 na 4 / 5 przypadków.

A propo pixeli, Jest to naprawdę niewykonalne w rozsądnym czasie? (rozsądny = zostawienie kompa na noc)

Offline koirat

  • Użytkownik

# Wrzesień 23, 2015, 18:27:29
Bias powinieneś losować jak wagę. Po co mnożysz bias przy każdej iteracji ?

Jak nie udaje ci się nauczyć to coś masz źle jak bawiłem sie NN to coś tak trywialnego jak XOR chyba zawsze mi się udawało.

Jaką metodę uczenia stosujesz.

Jak dużą masz tą bazę obrazków do nauczenia ? Swoją drogą  czy potrzebujesz aż taką dokładność ? Może wystarczy skalować te obrazki np do jakiegoś mniejszego rozmiaru.

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Wrzesień 23, 2015, 18:33:21
Ups pomyliło mi się, chodziło mi o learning rate a nie o bias ;) Bias mam 1 zawsze, wagi na początku losuje również te biasowe w zakresie -0.025 do 0.025.

Obrazków będzie tyle ile potrzeba, będę generował parę obrazków: wejściowy i wyjściowy i chcę nauczyć sieć przekształcenia, które dokonuję na wejściowym i otrzymuję wyjściowy. Obrazki te będą dosyć podobne.

Myślę nad rozwiązaniem 10000-1000-10000, czyli 1000 w ukrytej a wejście i wyjście mapuję na obrazek o rozdziałce 100x100px. Pod uwagę biorę jedynie skalę szarości, a więc kanał szarości mapuję z piksela 0-255 na wejścia/wyjścia -1 - +1

Offline koirat

  • Użytkownik

# Wrzesień 23, 2015, 19:08:31
learning rate ustaw sobie na 0.01 narazie niech będzie stałe później będziesz się bawił.

Cytuj
10000-1000-10000
Naprawdę nie wiesz na co się porywasz.

Powiedz co chcesz zrobić jakie ma być to przekształcenie ?

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Wrzesień 23, 2015, 19:10:32
Naprawdę nie wiesz na co się porywasz.

Powiedz co chcesz zrobić jakie ma być to przekształcenie ?

No nie wiem ;) No wyjśc i wejść nie obniżę bo to tak samo jakbym downsamplował obrazek.

Chcę zrobić np. blura (to jedno z przekształceń).

Offline Durson

  • Użytkownik

# Wrzesień 23, 2015, 22:21:06
Cześć,
Generalnie odradzam robienie blura za pomocą sieci neuronowych, ale mówisz też o innych przekształceniach. Jeśli to ma być do czegoś ważnego to też odradzam (najprawdopodobniej nie wyjdzie : ), ale jeśli chcesz się pobawić sieciami to polecam convolutional neural networks.
Są trochę bardziej skomplikowane od perceptrona, ale mają taką zaletę, że każdy piksel będzie poddany takiej samej transformacji niezależnie od położenia w obrazie (dzięki wspólnym wagom w warstwie). No i takie sieci można złożyć np. z 5 warstw ukrytych i je czegoś nauczyć (w przeciwieństwie do perceptronu, gdzie jest vanishing gradient).
Natomiast problem z sieciami jest taki, że zazwyczaj sieć się uczy pracować na featurach (które też mogą pochodzić z sieci, np. deep belief nn lub autoencoders), lecz tutaj musisz pracować na "żywych" pikselach. Problem leży w tym, że taki nieobrobiony feature vector złożony z pikseli ma tak ogromny wymiar, że w tej przestrzeni nie można nic sensownego zamodelować.
Inny pomysł, który wpadł mi do głowy (jest pewnie bardziej skomplikowany od conv net) to zrobienie jednowarstwowej restricted Boltzmann machine takiej postaci:
n*n neuronów w warstwie wejściowej (n to rozmiar obrazu)
n*n lub mniej w ukrytej
Taka sieć domyślnie operuje na wartościach binarnych ale nie musi (choć to największy kłopot jaki widzę).
Musiałbyś zmodyfikować też domyślny algorytm uczenia (alternating Gibbs sampling), aby stany generowało obrazem zwykłym, lecz odpowiedź sieci na warstwie wejściowej porównywało z obrazem po transformacji. Można też w tym modelu ograniczyć liczbę wag aby warstwa ukryta była połączona z wycinkiem (np. 3x3) wejściowej
Nie wiem czy to zadziała, ale powodzenia ;)
Pozdrawiam
« Ostatnia zmiana: Wrzesień 23, 2015, 22:45:14 wysłana przez Durson »

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Wrzesień 23, 2015, 22:49:49
Dzięki :) Poczytam o tym.

mają taką zaletę, że każdy piksel będzie poddany takiej samej transformacji niezależnie od położenia w obrazie (dzięki wspólnym wagom w warstwie).

Ale to można wykorzystać do np. blura? Chodzi mi o to, żeby nie każdy pojedyńczy piksel przekształcać tylko piksel w oparciu o piksele sąsiednie, np. z użyciem kernela.

Offline Durson

  • Użytkownik

  • +1
# Wrzesień 23, 2015, 23:11:12
Cześć, oczywiście piksel warstwy ukrytej jest połączony z wycinkiem pola poprzedniej, więc można w ten sposób zrobić blura nawet ręcznie ustawiając wagi :D

tutaj: http://deeplearning.net/tutorial/lenet.html jest dobry artykuł, szczególnie zobacz do rozdziału shared weights, aby zobaczyć to na oczy. Wagi o jednakowym kolorze mają wspólną siłę, więc przesuwanie obiektu w warstwie wejściowej spowoduje przesunięcie odpowiedzi warstwy ukrytej ale w sposób niezależny od położenia.

Właściwie znalazłem dobry artykuł o denoising autoencoders, który bazuje na podobnym pomyśle co Restricted BM z poprzedniego postu:
http://deeplearning.net/tutorial/dA.html
Cytuj
The idea behind denoising autoencoders is simple. In order to force the hidden layer to discover more robust features and prevent it from simply learning the identity, we train the autoencoder to reconstruct the input from a corrupted version of it.
Tyle, że u Ciebie zamiast corrupted byłoby transformed.
Autoencoders są podobne* do RBM, lecz mogą być pewnie prostsze w implementacji :)
Pozdrawiam

*Edit:
W zasadzie to autoencoders mogą być trenowane zarówno backpropem, jak i w stylu RBM dla lepszych rezultatów.
Aby zobaczyć jak to działa "na chłopski rozum" polecam film legendarnego człowieka: https://www.youtube.com/watch?v=AyzOUbkUf3M

Edit2:
Polecam też forum https://www.quora.com/, można tu wpaść na trop świetnych tematów i materiałów o machine learning.
« Ostatnia zmiana: Wrzesień 23, 2015, 23:26:35 wysłana przez Durson »

Offline mwojt

  • Użytkownik

# Październik 28, 2015, 23:04:19
Cytuj
Myślę nad rozwiązaniem 10000-1000-10000
Ja robiłem 5x5 pikseli i liczyłem jeden piksel wyjściowy, można tak zrobić blur, antyblur, powiększenie itp.
Efekt powiększenia:
http://zapodaj.net/85fafb9a43f97.jpg.html
Jakość porównywalna photozoom tylko liczy 100 razy dłużej.
Efekt wyostrzenia:
http://zapodaj.net/684b8d80d0147.jpg.html
Sieć trenowałem na 200 obrazkach (75-50-50-3), po 30 min. trenowania błąd przestaje spadać, właściwie spada już bardzo powoli.