赞
踩
今天看到
def gem(self, ipts): return F.avg_pool2d(ipts.clamp(min=self.eps).pow(self.p), (1, ipts.size(-1))).pow(1. / self.p)
这个函数中的F.avg_pool2d 不是很理解就查了一下
ipts.clamp(1.0e-6):
这个操作将ipts
中的每个元素限制在[1.0e-6, +inf)
的范围内。也就是说,任何小于1.0e-6
(一个非常小的正数)的值都会被替换为1.0e-6
,而大于或等于1.0e-6
的值则保持不变。这样做通常是为了避免数值不稳定问题,尤其是在进行对数运算、除法运算或幂运算时。
.pow(6.5):
将ipts
(经过clamp操作后)中的每个元素提升到6.5的幂。
F.avg_pool2d(..., (1, ipts.size(-1))):
使用F.avg_pool2d
函数对张量进行平均池化操作。这里有两个关键的参数:
ipts
。(1, ipts.size(-1))
定义了池化窗口的大小。这里,池化窗口的高度为1(即在高度上不进行池化),而宽度为ipts
的最后一个维度的大小(即ipts.size(-1)
)。这意味着池化操作将在最后一个维度上进行,并且沿着这个维度取平均值。.pow(1. / 6.5):
将池化后的结果张量中的每个元素取6.5的倒数次幂。这实际上是前面.pow(6.5)
操作的逆操作,用于恢复原始数据的某种形式
import torch import torch.nn.functional as F
F.avg_pool2d()数据是四维输入
input维度: (batch_size,channels,height,width)
kenerl维度:(二维:表示width的跨度)channel和输入的channle一致,如果数据是三维,则channel为1.(如果只写一个数n,kenerl=(n,n))
stride默认和kenerl一致,这是个二维的,所以在height和width上均和kenerl一致,越界同样丢弃。跟cnn卷积一致
在H和W维度求平均
- input=torch.randn(10,3,4,4)
- m=F.avg_pool2d(input,(4,4))
- print(m.size())
-
- torch.Size([10, 3, 1, 1])
- input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
- print(input.size())
- print(input)
- m = F.avg_pool2d(input,kernel_size=(4,4))
- m
- torch.Size([1, 5, 5])
- tensor([[[1., 1., 1., 1., 1.],
- [1., 1., 1., 1., 1.],
- [0., 0., 0., 1., 1.],
- [1., 1., 1., 1., 1.],
- [1., 1., 1., 1., 1.]]])
- tensor([[[0.8125]]])
-
- input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],[0,0,0,1,1],[1,1,1,1,1],[1,1,1,1,1]]).unsqueeze(0).float()
- print(input.size())
- print(input)
- m = F.avg_pool2d(input,kernel_size=(4,4),stride=1)
- m
- torch.Size([1, 5, 5])
- tensor([[[1., 1., 1., 1., 1.],
- [1., 1., 1., 1., 1.],
- [0., 0., 0., 1., 1.],
- [1., 1., 1., 1., 1.],
- [1., 1., 1., 1., 1.]]])
- tensor([[[0.8125, 0.8750],
- [0.8125, 0.8750]]])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。