ฉันสามารถใช้เป็น AveragePooling2D เลเยอร์กับ pool_size เท่ากับขนาดของความสามารถของคุณสมบัติบนแผนที่แทนที่จะเป็น GlobalAveragePooling2D เลเยอร์? จุดประสงค์ของเรื่องนี้จะแทนที่เป็นเป้าหมายของเลเยอร์หลังจากที่ FCN. คือ GlobalAveragePooling2D เป็นกรณีพิเศษของ AveragePooling2D??
GlobalAveragePooling2D
จะ downsample การนำเข้าข้อมูลจากการฆ่าคนโดยเฉลี่ยนค่าตาม spatial มิติและกลับมาเป็น 1D ผลส่งออกโดยปริยายออกจากคุณตั้งค่า keepdims= True
. AveragePooling2D
ยัง downsamples การนำเข้าข้อมูลแต่ต้องใช้คนโดยเฉลี่ยนค่ามาเป็นค่าหน้าต่างถูกกำหนดโดยที่ pool_size
พารามิเตอร์. ดังนั้นมันจะกลับไปเป็น 3 มิติแสดงผล:
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)
คุณอาจจะต้องลบรูของคุณส่งออกจาก AveragePooling2D
เลเยอร์ถ้าคุณต้องการแหล่งป้อนมันจะเป็น Dense
เลเยอร์หลังจากนั้น:
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)
ถ้ามันไม่ใช่อย่างนั้นคุณสามารถทิ้งมันไว้อย่างนี้ก็ได้
ปรับปรุง: GlobalAveragePooling2D
แล้ว AveragePooling2D
สามารถบางครั้งทำตัวเหมือนๆกันถ้าคุณปรับแก้ strides
แล้ว pool_size
พารามิเตอร์ได้ตามคาด:
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)
หรือ
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
. เหตุผลที่ไม่มีใครทำเรื่องนี้มันเป็นแค่ทางที่ง่ายกว่าที่จะใช้ทั่วไป pooling โดยตรง...