赞
踩
温故而知新,可以为师矣!
全局平均池化(Global Average Pooling)
一般情况下,卷积层用于提取二维数据,如图片、视频等特征。针对于具体任务(分类、回归、图像分割等),卷积层后续会用到不同类型的网络。拿分类问题举例,最简单的方式就是将卷积层提取出的特征(feature map)输入到softmax全连接层对应不同的类别。首先,这里的 feature map
是二维多通道的数据结构,类似于三个通道(红黄绿)的彩色图片,也就是说 feature map
具有空间维度的信息;其次,在GAP被提出之前,常用的方式是将 feature map
直接拉平成一维向量(下图a),但是GAP是将每个通道的二维图像做平均,最后每个通道对应一个均值(下图b)。
全局平均池化(Global Average Pooling, GAP),所谓的全局是针对常用的 Average Pooling
而言,Average Pooling
会有它的 filter_size
,比如 2 x 2
,全局平均池化就没有size,它针对的是整张 feature map
。GAP将 feature map
所有像素值相加求平均,得到一个数值,即用该数值表示对应 feature map
。
GAP的目的是代替全连接层。如果要预测K个类别,在特征提取的最后一层卷积层,会生成K个特征图,然后通过全局平均池化可以得到 K个1×1的特征图,将这些1×1的特征图输入到 softmax layer
后,每一个输出结果代表着这K个类别的概率值或置信度 confidence。
如上图所示。假设最终分成10类,则最后卷积层包含10个filters(即输出10个特征图),然后按照全局池化平均定义,分别对每个特征图,累加所有像素值并求平均,最后得到10个数值,将这10个数值输入到softmax层中,得到10个概率值,即这张图片属于每个类别的概率值。
GAP可以减少参数量,减少计算量,减少过拟合。如下图所示,一个 feature map
进行GAP后得到一个值,再进行全连接(softmax)就会少很多参数。
import torch
a = torch.rand([4,3,4,4])
print(a.size())
b = torch.nn.functional.adaptive_avg_pool2d(a, (1,1)) # 自适应池化,指定池化输出尺寸为 1 * 1
print(b.size())
输出结果:
torch.Size([4, 3, 4, 4])
torch.Size([4, 3, 1, 1])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。