F.ADAPTIVEMAXPOOL2D函数使用

pytorch官网原函数:
函数原型:torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)
在由多个输入平面组成的输入信号上应用 2D 自适应最大池化。
对于任何输入大小,输出的大小为(Hout, Wout),输出特征的数量等于输入平面的数量。

参数:
output_size: 输出shape,可以是(Hout,Wout),也可以是一个单独的Hout,代表输出shape是(Hout, Hout);甚至可以为None,代表输出与输入同shape
return_indices:如果为True,将返回索引以及输出。有用于传递给 nn.MaxUnpool2d。默认为False。

例子:

# target output size of 5x7
m = nn.AdaptiveMaxPool2d((5,7))
input = torch.randn(1, 64, 8, 9)
output = m(input)
#输出为(1, 64, 5, 7)
# target output size of 7x7 (square)
m = nn.AdaptiveMaxPool2d(7)
input = torch.randn(1, 64, 10, 9)
output = m(input)
#输出为(1,64,7,7)
# target output size of 10x7
m = nn.AdaptiveMaxPool2d((None, 7))
input = torch.randn(1, 64, 10, 9)
output = m(input)
输出为(1,64,10,7)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在mmdetection第二代中,可以通过修改FCOS的backbone网络来使用CBAM。具体步骤如下: 1. 在mmdet/models/backbones/resnet.py中导入CBAM模块: ```python from ..plugins.cbam import CBAM ``` 2. 在ResNet的构造函数中,实例化CBAM模块,并将其添加到每个ResNet block中。例如,在ResNet50中,可以添加以下代码: ```python self.cbam = CBAM(channels=256) ``` ```python for i, block in enumerate(self.layers): if i == 0: block.cbam = None else: block.cbam = copy.deepcopy(self.cbam) ``` 3. 在FCOS的构造函数中,将修改后的ResNet作为backbone网络: ```python self.backbone = ResNet( depth=self.backbone_depth, num_stages=4, strides=(1, 2, 2, 2), dilations=(1, 1, 1, 1), out_indices=(0, 1, 2, 3), frozen_stages=self.frozen_stages, norm_cfg=self.norm_cfg, norm_eval=self.train_cfg.get('norm_eval', True), style='pytorch', with_cbam=True # 添加这行代码 ) ``` 4. 在mmdet/models/plugins/cbam.py中实现CBAM模块: ```python import torch.nn as nn import torch.nn.functional as F class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3, 7), 'kernel size must be 3 or 7' padding = 3 if kernel_size == 7 else 1 self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv1(x) return self.sigmoid(x) class CBAM(nn.Module): def __init__(self, channels, reduction=16): super(CBAM, self).__init__() self.ca = ChannelAttention(channels, reduction) self.sa = SpatialAttention() def forward(self, x): out = x * self.ca(x) out = out * self.sa(out) return out ``` 通过以上步骤,就可以在FCOS中使用CBAM了。需要注意的是,以上代码仅适用于具有ResNet backbone的FCOS模型。如果使用其他的backbone网络,需要进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值