Korzystanie z AveragePooling2D zamiast GlobalAveragePooling 2D do wymiany grubszych warstw po FCN do klasyfikacji

0

Pytanie

Czy mogę korzystać z warstwy AveragePooling2D z wielkością puli równej wielkości karty obiektów, zamiast warstwy GlobalAveragePooling2D? celem tego jest, aby zastąpić gęstą warstwę po FCN. Czy GlobalAveragePooling2D prywatnym z okazji AveragePooling2D??

deep-learning keras tensorflow
2021-11-22 13:35:20
2

Najlepsza odpowiedź

2

GlobalAveragePooling2D będzie zmniejszona zbieranie danych wejściowych, poprzez średnią wartość przestrzennych wymiarów, i domyślnie zwróci 1D-wyjście, jeśli nie skorzystasz z opcji keepdims= True. AveragePooling2D zmniejsza również dane wejściowe, ale przyjmuje średnią wartość z okna wprowadzania, określanej pool_size parametr. W ten sposób zwróci 3D-wniosek:

import tensorflow as tf
x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
   strides=(1, 1), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
print(avg_pool_2d(x).shape)
print(avg_global_2d(x).shape)
(1, 2, 2, 1)
(1, 1)

Prawdopodobnie będziesz musiał wyrównać swój wniosek z AveragePooling2D warstwa, jeśli chcesz go przekazać w Dense warstwa po tym:

import tensorflow as tf
x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
   strides=(1, 1), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
print(tf.keras.layers.Flatten()(avg_pool_2d(x)).shape)
print(avg_global_2d(x).shape)
(1, 4)
(1, 1)

Jeśli nie, można po prostu zostawić wszystko tak jak jest.

Odśwież: GlobalAveragePooling2D i AveragePooling2D czasami może zachowywać się podobnie, jeśli można dostosować strides i pool_size parametry odpowiednio:

import tensorflow as tf
x = tf.constant([[1., 2., 3.],
                 [4., 5., 6.],
                 [7., 8., 9.]])

x = tf.reshape(x, [1, 3, 3, 1]) # Add batch dimension

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),
   strides=(3, 3), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()

print(avg_pool_2d(x))
print(avg_global_2d(x))
tf.Tensor([[[[3.]]]], shape=(1, 1, 1, 1), dtype=float32)
tf.Tensor([[5.]], shape=(1, 1), dtype=float32)

Lub

avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(3, 3),
   strides=(2, 2), padding='valid')
avg_global_2d = tf.keras.layers.GlobalAveragePooling2D()
tf.Tensor([[[[5.]]]], shape=(1, 1, 1, 1), dtype=float32)
tf.Tensor([[5.]], shape=(1, 1), dtype=float32)
2021-11-22 14:51:04

'x = wejście(forma=(128,128,3)) po jeszcze wiele poszczególnych warstw ja : 'a = Conv2D(200 ,(1,1), tapicerka = 'tak' , aktywacja='softmax', data_format = 'channels_last')(output_of_the_layer_before) jest ostatnim сверточного warstwy, to robię 'b = lambda(lambda x: wycisnąć(X, osi=2))(AveragePooling2D(pool_size=(1, 128))(a)
DSPinterested

Działa to dobrze dla konkretnego zadania, które mam, i to dało mi do myślenia o tym, że korzystanie z GlobalAveragePooling2D może być jedynym rozwiązaniem, dostępnym dla wymiany grubszych warstw... również z GlobalAveragePooling2D masz możliwość "keepdims= True" lub "keepdims= False", nie mogę podzielić się swoim kodem, mam nadzieję, że to miało dla ciebie sens
DSPinterested

Tak, dla mnie to miało sens ... ale na czym dokładnie polega twój problem teraz lub czego nie rozumiesz?
AloneTogether

Jak korzystanie z warstwy AveragePooling2D, opisanej powyżej, prowadzi do prawie tych samych wyników klasyfikacji, co i GlobalAveragePooling2D! Zwykle w literaturze ja prawie zawsze widziałem GlobalAveragePooling2D jako zamiennik grubszych warstw w FCN, ale nigdy nie widziałem, aby AveragePooling2D używany zamiast grubej warstwy
DSPinterested

Zaktualizowany odpowiedź, ale nie udało się odtworzyć kod, który dodaje się w komentarzach.. proszę uaktualnić swoje pytanie w odpowiednim kodem, wynikiem i pytaniem.
AloneTogether

Średnio na świecie stowarzyszenie nie reprezentuje sobą nic szczególnego. Można użyć średnia łączenie z rozmiarem filtra równej wielkości wejściowych i prawidłowym wypełnieniem, wtedy będzie dokładnie taki sam. Można nawet korzystać z funkcji takich jak tf.reduce_mean. Powodem, dla którego nikt tego nie robi, polega na tym, że o wiele łatwiej jest bezpośrednio korzystać z globalnej puli...
xdurch0

@xdurch0 , to ma sens!
DSPinterested
0

W uzupełnieniu do odpowiedzi powyżej, globalne średnie połączenie można użyć do uzyskania obrazów o zmiennym rozmiarze jako danych wejściowych. Jeśli formularz wprowadzania danych przed globalnym stowarzyszeniem jest (N,H,W,C) wtedy wyjście będzie (N,1,1,C) dla кераса, gdy keepdims=True. To sprawia, że wyświetlanie obrazów z różnych (H,W) twórz podobne dane wyjściowe formy.

Zalecenia:

2021-11-22 13:59:40

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................