Jak sprawić, by moja sieć traktowała jednakowo rotację danych wejściowych?


11

Próbuję zaprogramować własny system do uruchamiania sieci neuronowej. Aby zmniejszyć liczbę potrzebnych węzłów, zasugerowano, aby traktować obroty wejścia jednakowo.

Moja sieć stara się uczyć i przewidywać grę życia Conwaya, patrząc na każdy kwadrat i otaczające go kwadraty w siatce, i dając wynik dla tego kwadratu. Jego dane wejściowe to ciąg 9 bitów:

Szybowiec

Powyższe jest reprezentowane jako 010 001 111.

Istnieją jednak trzy inne obroty tego kształtu i wszystkie wytwarzają tę samą moc wyjściową:

Obroty szybowca

Moja topologia sieci to 9 węzłów wejściowych i 1 węzeł wyjściowy dla następnego stanu środkowego kwadratu na wejściu. Jak mogę zbudować ukryte warstwy, aby brały te same obroty tak samo, zmniejszając liczbę możliwych danych wejściowych do jednej czwartej oryginału?

Edytować:

Istnieje również odwrócenie każdego obrotu, co daje identyczny wynik. Włączenie ich spowoduje zmniejszenie moich nakładów o 1/8. W przypadku szybowca moim celem jest, aby wszystkie te dane wejściowe były traktowane dokładnie tak samo. Czy będzie to wymagało wstępnego przetwarzania, czy też mogę włączyć to do sieci?


Znakomite pytanie! Mam podobny, trudny problem z moim własnym projektem i będę bardzo zainteresowany poznaniem najbardziej skutecznych technik redukcji symetrii.
DukeZhou

@DukeZhou Mam wrażenie, że uzyskanie odpowiedzi zajmie trochę czasu. Jestem gotów zużyć moją niewielką liczbę przedstawicieli, aby w razie potrzeby ustawić nagrodę ...
Aric

Innym rozwiązaniem jest wstępne przetworzenie danych wejściowych, tak aby wszystkie 4 obroty były konwertowane na ten sam obraz przed dostarczeniem do sieci.
BlueMoon93,

Odpowiedzi:


4

Jeśli dobrze rozumiem, twój pojedynczy węzeł wyjściowy będzie następnym statusem kwadratu pośrodku. Nie musisz martwić się o liczbę węzłów w ukrytych warstwach, gdy masz wystarczające zasoby, aby trenować model. Problem ten jest bardzo łatwy do opanowania dla sieci neuronowej, więc nie ma obaw o rozmiar.

Musisz wykonać nadzorowane szkolenie, co oznacza, że ​​musisz wprowadzić dane wejściowe i dopasować oczekiwany wynik. Musisz mieć pewność, że w danych treningowych wszystkie 4 rotacje są przypisane do tego samego wyniku. W ten sposób Twoja sieć powinna nauczyć się traktować je wszystkie w ten sam sposób.

Zainspirowałeś mnie, więc spróbowałem siebie. Moje rozwiązanie może nauczyć się 100% poprawności w około 20 epokach uruchomionych w ciągu kilku sekund na moim starym laptopie. Ja tylko nieznacznie zmieniłem wynik, aby był kategoryczny [0,1] lub [1,0], ale daje to ten sam rezultat, którego szukasz. Dla odniesienia tutaj jest kod napisany w pythonie:

from keras.models import Sequential
from keras.layers import Input, Dense
from keras.models import Model
from keras import optimizers
from keras.utils.np_utils import to_categorical
import helper

x_,y_ = helper.fnn_csv_toXY("conway.csv","output",False)
y_binary = to_categorical(y_)

model = Sequential()
model.add(Dense(100, activation='relu', kernel_initializer='glorot_uniform',input_shape =(9,)))
model.add(Dense(20, activation='relu', kernel_initializer='glorot_uniform'))
model.add(Dense(2, activation='softmax'))
adam=optimizers.Adam()
model.compile(optimizer=adam,
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)

Sieć, z której będę korzystać, będzie symulowana przez napisaną przeze mnie klasę, stąd obawy dotyczące pamięci.
Aric

Jeśli chcesz zmniejszyć zużycie pamięci przez sieć, wówczas zmniejszenie liczby możliwych wejść (przez obrócenie) pomoże uzyskać mniejszą sieć. Łatwiejszym zadaniem uczenia się jest potrzebna mniejsza sieć. W takim przypadku przetwarzanie wstępne byłoby lepsze. Niemniej jednak NN służy do uczenia się pojęć i nauki gry w życie, którą należy karmić we wszystkich wzorach. Jeśli Twoim celem jest absolutne zminimalizowanie zajmowanej pamięci, rozwiąż problem w sposób liniowy.
Manngo,

Jeśli pamięć nie stanowi problemu, wolałbym, aby sieć wykonała tę operację z tych samych powodów, które podałeś. Wstępne przetwarzanie usuwa część zadania z sieci, upraszczając je.
Aric,

Popraw, a następnie przejdź do przetwarzania wstępnego. Myślę, że dzięki temu pytanie jest udzielane. Możesz go wdrożyć, jeśli napotkasz problemy z pamięcią. Wskazówka: użyj pływaka dla wag, które zajmują tylko 32 bity zamiast podwójnych, które wymagają 64. Spowoduje to zużycie mniej pamięci.
Manngo,

4

Zidentyfikowałeś optymalizację w swojej przestrzeni problemowej i pragniesz upiec to w swojej sieci neuronowej. Sugeruję wstępne przetwarzanie: skomponuj swoją optymalizację za pomocą sieci neuronowej, która wykonuje podzbiór tego, co chcesz.

Innymi słowy, znormalizuj dane wejściowe, ręcznie kodując algorytm rotacji, który obraca dane wejściowe, aby uchwycić równoważność wyróżnioną w poście. Następnie przekaż wynik tej transformacji do swojej sieci neuronowej, na trening i wszystkie inne zastosowania. Oznacza to, że trenujesz sieć neuronową, aby rozwiązać zidentyfikowany pod-problem - rotacje są zbędne.

Przetestuj swój normalizator, generując losowe dane wejściowe, obracając je do wszystkich czterech potencjalnych transformacji, uruchom normalizator na każdym z nich, a następnie sprawdź, czy wszystkie są równoważne.


1

Aby być purystą, zacznij od innego rozważenia danych wejściowych, jako okrągłej tablicy o rozmiarze cztery, z których każda zawiera parę bitów, a dodatkowo bit środkowy:

... 01, 01, 11, 10 ...

0

W całym projekcie sieci kontynuuj paradygmat struktury kołowej i punktu środkowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.