我可以使用一个AveragePooling2D层与pool_size的大小相等的特征图,而不是一个GlobalAveragePooling2D层? 这样做的目的是要取代一个密集层后FCN。 是GlobalAveragePooling2D一个特殊的情况下AveragePooling2D??
2
GlobalAveragePooling2D
将下采样的输入通过采取平均值的空间尺寸和返回1D输出默认情况下,除非你设置 keepdims= True
. AveragePooling2D
还downsamples输入但需要的平均值超过输入窗口所定义的 pool_size
参数。 因此,它将返回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)
你可能会压扁你的输出 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)
'x=输入(形=(128,128,3))后,许多友好通商航海层我:'a=Conv2D(200,(1,1),填充='相同的',激活='softmax',data_format='channels_last')(output_of_the_layer_before)'是最后一卷积层然后我做的'b=Lambda(lambda-x:挤(x轴=2))(AveragePooling2D(pool_size=(1,128))(一)
DSPinterested
这个完美的作品的现的具体任务,我有,我不知道,使用GlobalaveragePooling2D可能不是唯一的选择可用于更换稠密层...还有GlobalAveragePooling2D你有选择的'keepdims=True'或'keepdims=False',不能分享我的代码,我希望这对你有意义
DSPinterested
是的,这是有意义的我...但什么是你现在的问题或是什么你不理解?
AloneTogether
如何通过使用AveragePooling2D层如上所述导致几乎相同的分类结果作为GlobalAveragePooling2D! 通常在文献中我们几乎总是看到GlobalAveragePooling2D作为替换为稠密层,在FCN但从来没有见过AveragePooling2D正在使用,而不是一个密集层
DSPinterested
更新的答案,但不能再添加的代码中的评论意见..请更新你的问题的有关代码,结果,和你的问题。
AloneTogether
全球平均汇集的是没有什么特别的。 你可以使用的平均汇集用过滤器的尺寸等于输入的尺寸和有效填补,那么它完全相同。 你甚至可以利用的功能等
xdurch0
tf.reduce_mean
. 原因不是,它只是方式更易于使用全球汇集直接...
@xdurch0,有意义!
DSPinterested