Keras GlobalAveragePooling2D 空间数据的全局平均池化操作

发布时间 2023-10-08 09:35:43作者: emanlee

空间数据的全局平均池化操作。

一张图片通过卷积核提取特征,有几个卷积核就有几个特征。
一张图片需要经过几次卷积,每次卷积时卷积核的个数都按2的n次方增加。
第一次卷积, 卷积核2个, 得2张图,池化压缩长宽;
第二次卷积, 卷积核4个, 得4张图,池化压缩长宽;
因为卷积次数有限,池化大小默认(2,2),因此到最后2的n次方张图的长宽基本不等于1。
所以用GlobleAveragePooling2D将长宽压缩为1,也就是维度变为了(1,1,2的n次方)。
在TF2的框架下,这是用卷积提取特征的最后一步,用语句tf.keras.layers.GlobleAveragePooling2d()来实现。
这样就得到了一维数组,可以输入到全连接层。因为全连接层的第一层输入,只按受一维数组。

https://zhuanlan.zhihu.com/p/463457920

=================================================

GlobalAveragePooling2D带来的维度降低

全局平均池化,深度神经网络中经常使用的一个层,使用前后的尺寸分别为[B,H,W,C]->[B,C].特别要注意,这个层使用之后特征图尺寸的维度变成了2维而非4维。这将对你之后的计算带来影响。
解决方法

在numpy中有expand_dims函数可以实现增加维度的功能,keras中backend模块同样提供了这个函数,使用

K.expand_dims(x,1)

即为在H维度上增加了一维,我们调用该函数两次就可以达到和原来特征图一样的维度了。
链接:https://blog.csdn.net/qq_36763031/article/details/108326170

=================================================

GlobalAveragePooling2D就是将每张图片的每个通道值各自加起来再求平均,最后结果是没有了宽高维度,只剩下个数与平均值两个维度。可以理解为变成了多张单像素图片。

从形状上看:[B,H,W,C] ->GlobalAveragePooling2D -> [B,C]

下面有1张图片,高宽分别是2像素,RGB3个通道。即[1,2,2,3]
经过GlobalAveragePooling2D得到一个单通道单像素图片[1,3].?????
其中RGB各分通道的像素值都加起来之后得到了一个平均值。???

import tensorflow as tf

x = tf.random.normal((1,2,2,3))
x.shape
#  TensorShape([1, 2, 2, 3])
x

#
<tf.Tensor: shape=(1, 2, 2, 3), dtype=float32, numpy=
array([[[[ 1.0732665 , -0.316923  ,  0.34387082],
         [ 0.85719526,  0.383818  ,  0.0714375 ]],

        [[ 2.07628   ,  1.0945694 ,  0.6519038 ],
         [ 0.00441903,  1.2396817 ,  0.10125866]]]], dtype=float32)>

ax = tf.keras.layers.GlobalAveragePooling2D()(x)
ax.shape
# TensorShape([1, 3])
ax


#
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[1.0027902 , 0.60028654, 0.29211769]], dtype=float32)>



下面是2张,宽高都是2像素,RGB3个通道的图片。经过GlobalAveragePooling2D得到2张单通道单像素图片[2,3]。 每张图片的R通道所有像素值求了一个平均,G通道与B通道的像素值也求了一个平均。

a1 = tf.random.normal((2,2,2,3))
a1.shape
# TensorShape([2, 2, 2, 3])
a1

 


<tf.Tensor: shape=(2, 2, 2, 3), dtype=float32, numpy=
array([[[[-0.76654285,  1.79131   ,  1.0236188 ],
         [-0.6119361 , -1.5272698 , -0.364413  ]],

        [[ 0.07261603,  0.57860726,  0.4255542 ],
         [-0.57528603,  0.74275184,  0.07588626]]],


       [[[ 0.84789306,  1.2030426 , -1.7836232 ],
         [ 0.6010358 ,  1.3016247 , -0.7656161 ]],

        [[ 0.34526846,  2.0315964 ,  0.1813532 ],
         [-0.7089366 ,  0.6344181 ,  0.973302  ]]]], dtype=float32)>


pa1 = tf.keras.layers.GlobalAveragePooling2D()(a1)
pa1.shape
# TensorShape([2, 3])

pa1

 


<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[-0.47028726,  0.3963498 ,  0.29016155],
       [ 0.2713152 ,  1.2926704 , -0.34864607]], dtype=float32)>

链接:https://blog.csdn.net/weixin_42670810/article/details/120061091

=================================================

 

例子:

input_shape = (2, 4, 5, 3)
x = tf.random.normal(input_shape)
y = tf.keras.layers.GlobalAveragePooling2D()(x)
print(y.shape)
(2, 3)

输入形状:

  • 如果 data_format='channels_last' :形状为 (batch_size, rows, cols, channels) 的 4D 张量。
  • 如果 data_format='channels_first' :形状为 (batch_size, channels, rows, cols) 的 4D 张量。

输出形状:

  • 如果 keepdims =False:形状为 (batch_size, channels) 的二维张量。
  • 如果keepdims=真:
    • 如果 data_format='channels_last' :形状为 (batch_size, 1, 1, channels) 的 4D 张量
    • 如果 data_format='channels_first' :形状为 (batch_size, channels, 1, 1) 的 4D 张量
 

 http://www.manongjc.com/detail/31-ynmhjenfiarsjrg.html

=================================================

 

GAP (Global Average Pooling)可用于模型微调,在做图像分类比赛时效果较好.最早在<<Network In Network>>中提出.

在常见的卷积神经网络中,全连接层之前的卷积层负责对图像进行特征提取,在获取特征后,传统的方法是接上全连接层之后再进行激活分类,而GAP的思路是使用GAP来替代该全连接层(即使用池化层的方式来降维),更重要的一点是保留了前面各个卷积层和池化层提取到的空间信息\语义信息,所以在实际应用中效果提升也较为明显!,另外,GAP去除了对输入大小的限制!,而且在卷积可视化Grad-CAM中也有重要的应用.

 
 
 
 
gap-fc.jpg

 

GAP直接从 feature map 的通道信息下手,比如我们现在的分类有N种,那么最后一层的卷积输出的 feature map 就只有N个通道,然后对这个 feature map 进行全局池化操作,获得长度为N的向量,这就相当于直接赋予了每个通道类别的意义。

GAP层,通过减少模型中的参数总数来最小化过度拟合。 与最大池层类似,GAP层用于减小三维张量的空间维度。 然而,GAP层执行更极端类型的维数减少,其中尺寸为h×w×d的张量的尺寸减小为具有1×1×d的尺寸。 GAP层通过简单地获取所有hw值的平均值,将每个h×w特征映射层减少为单个数字.

 
global_average_pooling.png
  • 可以这样使用GAP层,即GAP层之后是一个密集连接的层,其中softmax激活函数产生预测的对象类。
 
链接:https://www.jianshu.com/p/510072fc9c62

 =================================================