深度学习论文: Activate or Not: Learning Customized Activation及其PyTorch实现
发布日期:2021-06-30 20:33:05 浏览次数:2 分类:技术文章

本文共 2272 字,大约阅读时间需要 7 分钟。

深度学习论文: Activate or Not: Learning Customized Activation及其PyTorch实现

Activate or Not: Learning Customized Activation
PDF:
PyTorch代码:
PyTorch代码:

1 概述

将ReLU和NAS搜索出来的Swish激活函数联系起来,并推广到一般的形式,为了让网络自适应的调整是否激活,并通过设置了两层1x1卷积来控制。

在这里插入图片描述

2 ACON

ACON-A:Swish激活函数是ReLU函数的一种平滑近似。

ACON-B:PReLU,Leaky-ReLU等也可以进一步推广
ACON-C:更为广泛,通过p1和p2两个可学习参数来自适应调整
在这里插入图片描述
PyTorch代码:

class AconC(nn.Module):    r""" ACON activation (activate or not).    # AconC: (p1*x-p2*x) * sigmoid(beta*(p1*x-p2*x)) + p2*x, beta is a learnable parameter    # according to "Activate or Not: Learning Customized Activation" 
. """ def __init__(self, width): super().__init__() self.p1 = nn.Parameter(torch.randn(1, width, 1, 1)) self.p2 = nn.Parameter(torch.randn(1, width, 1, 1)) self.beta = nn.Parameter(torch.ones(1, width, 1, 1)) def forward(self, x): return (self.p1 * x - self.p2 * x) * torch.sigmoid(self.beta * (self.p1 * x - self.p2 * x)) + self.p2 * x

3 Meta-ACON

作者首先设置了p1和p2这两个可学习参数,并且设置了fc1和fc2两个1x1卷积。在前向过程中,首先计算beta,x首先在H和W维度上求均值,然后经过两层1x1卷积,最后由sigmoid激活函数得到一个(0, 1)的值,用于控制是否激活。

PyTorch代码:

class MetaAconC(nn.Module):    r""" ACON activation (activate or not).    # MetaAconC: (p1*x-p2*x) * sigmoid(beta*(p1*x-p2*x)) + p2*x, beta is generated by a small network    # according to "Activate or Not: Learning Customized Activation" 
. """ def __init__(self, width, r=16): super().__init__() self.fc1 = nn.Conv2d(width, max(r, width // r), kernel_size=1, stride=1, bias=True) self.bn1 = nn.BatchNorm2d(max(r, width // r)) self.fc2 = nn.Conv2d(max(r, width // r), width, kernel_size=1, stride=1, bias=True) self.bn2 = nn.BatchNorm2d(width) self.p1 = nn.Parameter(torch.randn(1, width, 1, 1)) self.p2 = nn.Parameter(torch.randn(1, width, 1, 1)) def forward(self, x): beta = torch.sigmoid( self.bn2(self.fc2(self.bn1(self.fc1(x.mean(dim=2, keepdims=True).mean(dim=3, keepdims=True)))))) return (self.p1 * x - self.p2 * x) * torch.sigmoid(beta * (self.p1 * x - self.p2 * x)) + self.p2 * x

然后作者针对不同大小的网络做出了调整,针对小网络它替换了所有ReLU激活层,针对大网络(如ResNet50/101)只替换了每一个Block中3x3卷积后面的ReLU激活层,原因是为了避免过拟合,但其实是因为额外增加的参数量较大。

Meta-ACON虽然带来了一定的参数量,但是对大网络和小网络上都是有一定的提升

在这里插入图片描述
针对设计空间做了一系列消融实验,其中channel-wise的效果是最好的
在这里插入图片描述

转载地址:https://liumin.blog.csdn.net/article/details/116994114 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:PyTorch中的Hook函数
下一篇:目标检测中的Bounding Box Regression Loss

发表评论

最新留言

很好
[***.229.124.182]2024年05月02日 10时34分39秒