Pot folosi un AveragePooling2D strat cu pool_size egală cu dimensiunea caracteristică hartă în loc de un GlobalAveragePooling2D strat? scopul este de a înlocui un strat dens după o FCN. ESTE GlobalAveragePooling2D un caz special de AveragePooling2D??
GlobalAveragePooling2D
va downsample o intrare prin luarea valoarea medie a lungul dimensiuni spațiale și să se întoarcă un 1D ieșire în mod implicit, dacă nu ați setat keepdims= True
. AveragePooling2D
de asemenea, sub-eșantionează o intrare, dar are valoarea medie pe o fereastra de intrare definit de pool_size
parametru. Deci, se va returna o ieșire 3D:
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)
Probabil că va trebui să aplatiza ieșire din AveragePooling2D
strat dacă doriți să-l hrănească la un Dense
strat după aceea:
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)
Dacă nu este cazul, puteți să-l lăsați așa cum este.
Update: GlobalAveragePooling2D
și AveragePooling2D
poate, uneori, se comportă în mod similar dacă reglați strides
și pool_size
în consecință parametrii:
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)
Sau
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
. Motivul pentru care nimeni nu face acest lucru este că e mult mai ușor de utilizat global comun direct...