Sztuczna sieć neuronowa (ANN) z dowolną liczbą wejść i wyjść

10

Chciałbym użyć ANN dla mojego problemu, ale problem polega na tym, że moje numery wejściowe i wyjściowe węzłów nie są naprawione.

Zanim zadałem pytanie, przeprowadziłem wyszukiwanie w Google i okazało się, że RNN może mi pomóc w rozwiązaniu mojego problemu. Ale wszystkie przykłady, które znalazłem, mają w jakiś sposób określoną liczbę węzłów wejściowych i wyjściowych.

Tak więc szukam strategii, jak ją urzeczywistnić, a przynajmniej kilka przykładów, najlepiej w Keras lub PyTorch.

Więcej szczegółów na temat mojego problemu:

Mam dwie listy danych wejściowych, w których długość pierwszej jest stała i wynosi dwie, np .:

in_1 = [2,2] 

ale długość drugiej listy jest elastyczna, długość może wynosić od trzech do inf, np .:

in_2 = [1,1,2,2]

lub

in_2 = [1,1,1,2,2,2,3,3,3]

Również listy wejściowe zależą od siebie. Pierwsza lista pokazuje wymiar listy wyników. Więc jeśli in_1 = [2,2], oznacza, że ​​wyjście musi mieć możliwość przekształcenia do postaci [2,2].

Obecnie myślę o połączeniu dwóch list wejściowych w jedną:

in = in_1 + in_2 = [2, 2, 1, 1, 2, 2]

Ponadto dane wyjściowe mają taką samą długość jak lista in_2 , fi:

jeśli listy wejściowe to:

in_1 = [2, 2]
in_2 = [1, 1, 2, 2]

Dane wyjściowe powinny wynosić:

out = [1, 2, 1, 2]

Wszelkie pomysły są mile widziane!

Paddy
źródło

Odpowiedzi:

6

Odpowiedź może zależeć od znaczenia długości wektora wejściowego lub od jego pochodzenia.

Jednak najprostszym rozwiązaniem jest zazwyczaj znajomość wejścia o największym rozmiarze i użycie go jako liczby wektorów. Jeśli podane dane wejściowe mają mniejszą długość, możesz uzupełnić je zerami lub odpowiednimi symbolami. Zatem zamiast wektora [1, 2, 3] i [1, 2, 2, 3] możesz mieć wektory [1, 2, 3, 0] i [1, 2, 2, 3].

To samo może dotyczyć wyników. Jeśli oczekiwany wynik to [1, 2, 1] i [1, 3, 4, 1], możesz traktować pierwszy wynik jako [1, 2, 1, 0]

Czy to nie tylko hack?

Zazwyczaj sieci neuronowe działają w przybliżeniu. Idealnie reprezentuje wektory (macierze) jako dane wejściowe i wektory (macierze) jako dane wyjściowe. Dlatego zawsze pożądane jest, aby rozmiar wektora wejściowego był stały.

Dipan Mehta
źródło
Ok, to jasne, że mogę wprowadzić wypełnienie dla danych wejściowych. Ale jak zdefiniować rozmiar węzłów wyjściowych?
Paddy,
3

Myślę, że mogłeś źle zrozumieć stałą liczbę danych wejściowych dla RNN. Jest to liczba wejść przypadających na czas . Wszystkie twoje przykłady mają stałą liczbę danych wejściowych na czas: 1! Podajesz je pojedynczo do swojej sieci neuronowej, kończąc specjalnym tokenem „końca” (zawsze możesz mieć do tego drugi wkład). Naucz go, aby nie dawał wyjścia, dopóki nie zobaczy tokenu końcowego, a następnie wypisywać składniki wyniku pojedynczo, kończąc na specjalnym końcowym tokenie wyjściowym.

Arthur Tacca
źródło
wow, dzięki! Czy znasz jakiś przyzwoity samouczek / przykład, aby lepiej to zrozumieć?
Paddy
1
@Paddy Zobacz awesome-rnn dla niektórych linków, np. Char-rnn jest całkiem zabawny.
Arthur Tacca
2

Wiedząc, że pierwsza lista jest prawie niezmienna (tylko opisuje pewną geometrię), możesz również spróbować stworzyć wiele różnych, wyspecjalizowanych NN dla każdej odrębnej konfiguracji in_1 i użyć tylko in_2 do zasilania sieci.

Więc in_1 może prowadzić różne sieci

in_1=[1,1]? --> NN #1 (n1) --> (o1)
in_1=[2,1]? --> NN #2 (n1,n2) --> (o1,o2)
in_1=[2,2]? --> NN #3 (n1,n2,n3,n4) -> (o1,o2,o3,o4)

W pierwszym kroku określasz konfigurację (tj. Tworzysz słownik), a następnie odpowiednio szkolisz / karmisz wyspecjalizowane sieci.

Jürgen Schwietering
źródło
to właściwie dobry pomysł, ale liczba kształtów jest dość duża ... w każdym razie dziękuję za wkład!
Paddy