当前位置:   article > 正文

global average pooling的特性以及1x1卷积_globalavgpool

globalavgpool

Pytorch中的全局平均池化
第一种函数 torch.nn.AvgPool2d(kernel, stride)

x = torch.randn(1, 256, 100, 100)
gap= torch.nn.AvgPool2d(kernel_size = 100) 或者 torch.nn.AvgPool2d(100)
x=gap(x) # x.size()=torch.Size([1, 256, 1, 1])
x = x.squeeze() #降维  torch.Size([1, 256, 1, 1]) ---> torch.Size([256])
print(x.size())  # torch.Size([256])
  • 1
  • 2
  • 3
  • 4
  • 5

第二种函数 torch.nn.AdaptiveAvgPool2d((H,W))
功能:该函数与二维平均池化运算类似,区别主要体现在自适应上,
output_size:指定的输出大小,可以是元组(H,W),或者是单个的数,如果是单个的数,则表示输出的高和宽尺寸一样,output_size大小可以大于输入的图片尺寸大小。

import torch
from torch import nn
img=torch.arange(24,dtype=torch.float).reshape(1,1,4,6)
pool_1=nn.AdaptiveAvgPool2d((2,3))
pool_2=nn.AdaptiveAvgPool2d(2)
img_1=pool_1(img)
img_2=pool_2(img)
print(img)
print(img_1)
print(img_2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

指定输出为1x1的时候,nn.AdaptiveAvgPool2d(1)相当于nn.AvgPool2d(1)

import torch
from torch import nn
img=torch.arange(48,dtype=torch.float).reshape(1,2,4,6)
pool=nn.AdaptiveAvgPool2d(1)
img_1=pool(img)
print(img_1)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1 X 1卷积的作用:
W ∗ H ∗ C 1 W*H*C_1 WHC1 C 1 ∗ 1 ∗ 1 ∗ C 2 C_1*1*1*C_2 C111C2做卷积,得到的feature map大小不变,但是会在特征维度上进行交互和整合,当 C 2 C_2 C2小于 C 1 C_1 C1时,可以起到降维的作用。
1 ∗ 1 1*1 11卷积先进行降维,再做 3 ∗ 3 3*3 33卷积,可以减少参数的使用。
比如说 W ∗ H ∗ 128 W*H*128 WH128 128 ∗ 3 ∗ 3 ∗ 256 128*3*3*256 12833256做卷积,使用的参数数目是 128 ∗ 3 ∗ 3 ∗ 256 128*3*3*256 12833256,而 W ∗ H ∗ 128 W*H*128 WH128 128 ∗ 1 ∗ 1 ∗ 64 128*1*1*64 1281164做卷积,再和 64 ∗ 3 ∗ 3 ∗ 256 64*3*3*256 6433256做卷积,这里使用的卷积的数目是 128 ∗ 1 ∗ 1 ∗ 64 + 64 ∗ 3 ∗ 3 ∗ 256 128*1*1*64+64*3*3*256 1281164+6433256,远远小于 128 ∗ 3 ∗ 3 ∗ 256 128*3*3*256 12833256
在这里插入图片描述
在这里插入图片描述

Global average pooling(GAP)刚刚提出的时候主要是为了替代全连接层,因为全连接层参数众多,而使用GAP抗过拟合性更好。

  • 全连接层
    比如卷积最后一层是[36,10,10,64],如果用全连接层,那么过程是先使用flatten操作,张量变成【36,6400】,假如有81个类,那么全连接层的参数就是【6400,81】,最终向量是【36,81】;
  • Global Average Pooling优点
    全局平均池化层不需要参数,避免在该层产生过拟合
    全局平均池化对空间信息进行求和,对输入的空间变化的鲁棒性更强。

下面是tensorflow的global average pooling实现

x=tf.ones([36,10,10,64])
下面的操作就相当于global average pooling,
对每一张10*10 feature map做平均操作
tf.reduce_mean(x,axis=[1,2],keep_dims=True)
因为keep_dims=True,所以得到的向量变成36*1*1*64
为了得到全连接层,则使用tf.reduce_mean(x,axis=[1,2],keep_dims=False)
得到向量36*64
再接一个小的全连接层参数64*81,就可以得到最终全连接层36*81
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

举个例子
在squeeze excitation net (SE Net)中,构造基本模块就使用了1x1卷积,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/92467
推荐阅读
  

闽ICP备14008679号