Jaka jest rola „Spłaszczenia” w Keras?

109

Próbuję zrozumieć rolę tej Flattenfunkcji w Keras. Poniżej znajduje się mój kod, który jest prostą siecią dwuwarstwową. Pobiera dwuwymiarowe dane kształtu (3, 2) i generuje jednowymiarowe dane kształtu (1, 4):

model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

x = np.array([[[1, 2], [3, 4], [5, 6]]])

y = model.predict(x)

print y.shape

To drukuje, że yma kształt (1, 4). Jeśli jednak usunę Flattenlinię, to wydrukuje się, która yma kształt (1, 3, 4).

Nie rozumiem tego. Z mojego rozumienia sieci neuronowych model.add(Dense(16, input_shape=(3, 2)))wynika , że funkcja ta tworzy ukrytą, w pełni połączoną warstwę z 16 węzłami. Każdy z tych węzłów jest podłączony do każdego z elementów wejściowych 3x2. Dlatego 16 węzłów na wyjściu tej pierwszej warstwy jest już „płaskich”. Zatem wyjściowy kształt pierwszej warstwy powinien wynosić (1, 16). Następnie druga warstwa przyjmuje to jako dane wejściowe i wyprowadza dane kształtu (1, 4).

Jeśli więc wydruk pierwszej warstwy jest już „płaski” i ma kształt (1, 16), po co mam go dalej spłaszczać?

Karnivaurus
źródło

Odpowiedzi:

123

Jeśli przeczytasz wpis w dokumentacji Keras Dense, zobaczysz, że to połączenie:

Dense(16, input_shape=(5,3))

dałoby w rezultacie Densesieć z 3 wejściami i 16 wyjściami, które byłyby stosowane niezależnie dla każdego z 5 kroków. Tak więc, jeśli D(x)przekształci wektor trójwymiarowy w wektor 16-wymiarowy, to, co otrzymasz jako wynik z warstwy, będzie sekwencją wektorów: [D(x[0,:]), D(x[1,:]),..., D(x[4,:])]z kształtem (5, 16). Aby uzyskać zachowanie, które określasz, możesz najpierw Flattenwprowadzić dane wejściowe do wektora 15-wymiarowego, a następnie zastosować Dense:

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')

EDYCJA: Jak niektórzy ludzie mieli problem ze zrozumieniem - tutaj masz obraz wyjaśniający:

wprowadź opis obrazu tutaj

Marcin Możejko
źródło
Dziękuję za wyjaśnienie. Jednak dla wyjaśnienia: Dense(16, input_shape=(5,3)czy każdy neuron wyjściowy z zestawu 16 (i dla wszystkich 5 zestawów tych neuronów) będzie połączony ze wszystkimi (3 x 5 = 15) neuronami wejściowymi? Czy też każdy neuron w pierwszym zestawie 16 będzie połączony tylko z 3 neuronami w pierwszym zestawie 5 neuronów wejściowych, a następnie każdy neuron w drugim zestawie 16 będzie podłączony tylko do 3 neuronów w drugim zestawie 5 wejść neurony, itp .... Nie wiem, który to jest!
Karnivaurus
1
Masz jedną gęstą warstwę, która pobiera 3 neurony i wyjście 16, które jest nakładane na każdy z 5 zestawów po 3 neurony.
Marcin Możejko
1
Ach ok. To, co próbuję zrobić, to wziąć listę 5 kolorowych pikseli jako dane wejściowe i chcę, aby przechodziły przez w pełni połączoną warstwę. Tak więc input_shape=(5,3)środki, które są 5 pikseli, a każdy piksel zawiera trzy kanały (R, G, B). Ale zgodnie z tym, co mówisz, każdy kanał byłby przetwarzany indywidualnie, podczas gdy ja chcę, aby wszystkie trzy kanały były przetwarzane przez wszystkie neurony w pierwszej warstwie. Czy więc nałożenie Flattenwarstwy natychmiast na początku dałoby mi to, czego chcę?
Karnivaurus
8
Mały rysunek zi bez Flattenmoże pomóc w zrozumieniu.
Xvolks
2
Ok, chłopaki - dostarczyłem wam zdjęcie. Teraz możesz usunąć swoje głosy przeciw.
Marcin Możejko
52

wprowadź opis obrazu tutaj W ten sposób działa Flatten, konwertując Matrix na pojedynczą tablicę.

Mahesh Kembhavi
źródło
4
Ten facet musi zrobić więcej zdjęć. Lubię to. To ma sens.
alofgran
10
Tak, ale dlaczego jest to potrzebne, myślę, że to jest właściwe pytanie.
Helen
35

krótka lektura:

Spłaszczenie tensora oznacza usunięcie wszystkich wymiarów z wyjątkiem jednego. To jest dokładnie to, co robi warstwa Spłaszcz.

długo czytane:

Jeśli weźmiemy pod uwagę oryginalny model (z warstwą Flatten), otrzymamy następujące podsumowanie modelu:

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0

W tym podsumowaniu, mam nadzieję, że następny obraz zapewni trochę więcej informacji na temat rozmiarów wejściowych i wyjściowych dla każdej warstwy.

Kształt wyjściowy warstwy Spłaszcz, jak można przeczytać, to (None, 48). Oto wskazówka. Powinieneś to przeczytać (1, 48)albo (2, 48)albo ... albo (16, 48)... albo (32, 48)...

W rzeczywistości Nonena tej pozycji oznacza dowolną wielkość partii. Aby dane wejściowe były przywołane, pierwszy wymiar oznacza rozmiar partii, a drugi oznacza liczbę funkcji wejściowych.

Rola warstwy Flatten w Keras jest bardzo prosta:

Operacja spłaszczania na tensorze zmienia kształt tensora tak, aby miał kształt równy liczbie elementów zawartych w tensorze, bez uwzględnienia wymiaru partii .

wprowadź opis obrazu tutaj


Uwaga: użyłem tej model.summary()metody, aby podać kształt wyjściowy i szczegóły parametrów.

prosti
źródło
1
Bardzo wnikliwy diagram.
Shrey Joshi,
1
Dzięki za diagram. Daje mi to jasny obraz.
Sultan Ahmed Sagor
0

Spłaszcz wyraźny sposób serializacji wielowymiarowego tensora (zazwyczaj wejściowego). Pozwala to na mapowanie między (spłaszczonym) tensorem wejściowym a pierwszą ukrytą warstwą. Jeśli pierwsza ukryta warstwa jest „gęsta”, każdy element (serializowanego) tensora wejściowego zostanie połączony z każdym elementem ukrytej tablicy. Jeśli nie używasz Spłaszczania, sposób mapowania tensora wejściowego na pierwszą ukrytą warstwę byłby niejednoznaczny.

roberto
źródło
0

Niedawno zetknąłem się z tym, z pewnością pomogło mi to zrozumieć: https://www.cs.ryerson.ca/~aharley/vis/conv/

Jest więc dane wejściowe, Conv2D, MaxPooling2D itp., Warstwy Flatten są na końcu i pokazują dokładnie, jak są tworzone i jak przechodzą do definiowania ostatecznych klasyfikacji (0-9).

Inżynier
źródło