Bir GlobalAveragePooling2D katmanı yerine özellik eşlemesinin boyutuna eşit pool_size ile bir AveragePooling2D katmanı kullanabilir miyim? bunun amacı, bir FCN'DEN sonra yoğun bir tabakanın değiştirilmesidir. GlobalAveragePooling2D, averagepooling2d'nin özel bir durumu mu??
GlobalAveragePooling2D
uzamsal boyutlar boyunca ortalama değeri alarak bir girişi aşağı örnekleyecek ve siz ayarlamadığınız sürece varsayılan olarak bir 1D çıkışı döndürecektir keepdims= True
. AveragePooling2D
ayrıca bir girişi altörnekler, ancak tarafından tanımlanan bir giriş penceresi üzerinden ortalama değeri alır pool_size
parametre. Böylece, bir 3D çıktı döndürecektir:
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)
Muhtemelen çıkışınızı düzleştirmek zorunda kalacaksınız. AveragePooling2D
eğer bir katmana beslemek istiyorsanız Dense
daha sonra katman:
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)
Eğer durum böyle değilse, olduğu gibi bırakabilirsiniz.
Güncelleme: GlobalAveragePooling2D
ve AveragePooling2D
ayarlarsanız bazen benzer şekilde davranabilir strides
ve pool_size
buna göre parametreler:
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)
Veya
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
. Kimsenin bunu yapmamasının nedeni, küresel havuzu doğrudan kullanmanın çok daha kolay olmasıdır...