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

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])

第二种函数 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)

指定输出为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 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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值