softpool池化操作

  1. 前言
    通常卷积神经网络(CNNs)都会使用池化pool操作来减少Feature Map的尺寸。这个过程对于实现局部空间不变和增加后续卷积的感受野是至关重要的。因此池化pool操作应该尽量减少Feature Map映射中信息的丢失。同时,应该限制计算和内存开销。

为了满足这些需求,本文提出了一种快速、高效的池化方法SoftPool,softpool可以以指数加权方式累加激活。与一系列其他池化方法相比,SoftPool在下采样激活映射中保留了更多的信息。更精细的下采样导致更好的分类精度。在ImageNet上,对于一系列流行的CNN架构,用SoftPool替换原来的池化操作可以带来1-2%的一致性精度提升。SoftPool在视频数据集上的动作识别。同样,在计算负载和内存仍然有限的情况下,仅替换池化层依然可以提高精度。

注:我将程序中的池化都改为softpool操作后,未超过模型的当前最优精度,可能是我的模型精度已经很高,优化也不太容易超越这个精度,转模型onnx是可以转成的,但是部署到板子上时,量化会不支持其中的指数EXP操作。

softpool详见:https://mp.weixin.qq.com/s/bgkg0LKwWlMvoK951pOeiQ

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
SoftPool是一种可微分的池化函数,它可以用于替代传统的max-pooling和average-pooling等操作。在PyTorch中,我们可以通过重载torch.autograd.Function类的forward和backward方法来实现SoftPool操作。 以下是一个使用PyTorch实现SoftPool的示例代码: ```python import torch import torch.nn as nn class SoftPoolFunction(torch.autograd.Function): @staticmethod def forward(ctx, input, alpha=1.0): # 计算SoftPool函数 exp_input = torch.exp(alpha * input) output = 1.0 / torch.sum(exp_input, dim=-1, keepdim=True) * exp_input # 缓存反向传播所需的变量 ctx.save_for_backward(output, alpha) return output @staticmethod def backward(ctx, grad_output): # 获取前向传播所需的变量 output, alpha = ctx.saved_tensors # 计算SoftPool函数的导数 weighted_output = output * grad_output sum_weighted_output = torch.sum(weighted_output, dim=-1, keepdim=True) grad_input = alpha * output * (grad_output - sum_weighted_output) return grad_input, None class SoftPool(nn.Module): def __init__(self, alpha=1.0): super(SoftPool, self).__init__() self.alpha = alpha def forward(self, input): return SoftPoolFunction.apply(input, self.alpha) ``` 在这个示例代码中,我们定义了一个SoftPoolFunction类,它继承自torch.autograd.Function类,并重载了forward和backward方法。在forward方法中,我们计算了SoftPool函数,并将结果保存在ctx中以供反向传播使用。在backward方法中,我们根据SoftPool函数的导数计算输入的梯度。 我们还定义了一个SoftPool类,它继承自nn.Module类,并在其中调用SoftPoolFunction。这样,我们就可以像其他PyTorch模型一样将SoftPool层加入到网络中。 使用SoftPool层的示例代码如下: ```python import torch import torch.nn as nn from softpool import SoftPool class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1) self.softpool1 = SoftPool(alpha=1.0) self.conv2 = nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1) self.softpool2 = SoftPool(alpha=1.0) self.fc = nn.Linear(64 * 8 * 8, 10) def forward(self, x): x = self.conv1(x) x = self.softpool1(x) x = self.conv2(x) x = self.softpool2(x) x = x.view(-1, 64 * 8 * 8) x = self.fc(x) return x ``` 在这个示例代码中,我们定义了一个包含两个SoftPool层的卷积神经网络。可以看到,我们可以像使用其他PyTorch层一样使用SoftPool层。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一位不愿暴露自己的小可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值