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??
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)
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...