Próbuję zrozumieć rolę tej Flatten
funkcji 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 y
ma kształt (1, 4). Jeśli jednak usunę Flatten
linię, to wydrukuje się, która y
ma 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ć?
źródło
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!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żenieFlatten
warstwy natychmiast na początku dałoby mi to, czego chcę?Flatten
może pomóc w zrozumieniu.W ten sposób działa Flatten, konwertując Matrix na pojedynczą tablicę.
źródło
krótka lektura:
długo czytane:
Jeśli weźmiemy pod uwagę oryginalny model (z warstwą Flatten), otrzymamy następujące podsumowanie modelu:
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
None
na 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 .
Uwaga: użyłem tej
model.summary()
metody, aby podać kształt wyjściowy i szczegóły parametrów.źródło
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.
źródło
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).
źródło