赞
踩
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
W∗H∗C1和
C
1
∗
1
∗
1
∗
C
2
C_1*1*1*C_2
C1∗1∗1∗C2做卷积,得到的feature map大小不变,但是会在特征维度上进行交互和整合,当
C
2
C_2
C2小于
C
1
C_1
C1时,可以起到降维的作用。
用
1
∗
1
1*1
1∗1卷积先进行降维,再做
3
∗
3
3*3
3∗3卷积,可以减少参数的使用。
比如说
W
∗
H
∗
128
W*H*128
W∗H∗128 和
128
∗
3
∗
3
∗
256
128*3*3*256
128∗3∗3∗256做卷积,使用的参数数目是
128
∗
3
∗
3
∗
256
128*3*3*256
128∗3∗3∗256,而
W
∗
H
∗
128
W*H*128
W∗H∗128和
128
∗
1
∗
1
∗
64
128*1*1*64
128∗1∗1∗64做卷积,再和
64
∗
3
∗
3
∗
256
64*3*3*256
64∗3∗3∗256做卷积,这里使用的卷积的数目是
128
∗
1
∗
1
∗
64
+
64
∗
3
∗
3
∗
256
128*1*1*64+64*3*3*256
128∗1∗1∗64+64∗3∗3∗256,远远小于
128
∗
3
∗
3
∗
256
128*3*3*256
128∗3∗3∗256。
Global average pooling(GAP)刚刚提出的时候主要是为了替代全连接层,因为全连接层参数众多,而使用GAP抗过拟合性更好。
下面是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卷积,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。