# Smooth Maximum

Smooth Maximum

```import numpy as np
import matplotlib.pyplot as plt

def smooth_maximum(x, x1_func, x2_func, beta=0.0):
"""
Smooth Maximum
:param x: The input variable
:param x1_func: The functor of n1
:param x2_func: The functor of n2
:param beta: The beta value
:return:
"""
a_x = x1_func(x)
b_x = x2_func(x)

e_beta_a_x = np.exp(beta * a_x)
e_beta_b_x = np.exp(beta * b_x)

return ((a_x * e_beta_a_x) + (b_x * e_beta_b_x)) / (e_beta_a_x + e_beta_b_x)```

# 从ReLU推广到Swish

```def swish(x, beta=1.0):
return beta * x / (1 + np.exp(-x))

Acon_a = lambda x: smooth_maximum(x, x1_func=lambda x: x, x2_func=lambda x: 0, beta=1.0)

x = np.arange(-5, 5, 0.01).astype(np.float32)

acon_a_out = Acon_a(x)
swish_out = swish(x)

plt.plot(x, acon_a_out, ls='--')
plt.plot(x, swish_out, ls='-.')
plt.grid()
plt.show()```

ACON-A

# ACON-B

```def leaky_relu(x, beta):
return np.maximum(x, beta * x)

Acon_b = lambda x: smooth_maximum(x, x1_func=lambda x: x, x2_func=lambda x: 0.2 * x, beta=1.0)

x = np.arange(-5, 5, 0.01).astype(np.float32)
acon_b_out = Acon_b(x)
leaky_relu_out = leaky_relu(x, 0.2)

plt.plot(x, acon_b_out)
plt.plot(x, leaky_relu_out)

plt.grid()
plt.show()```

ACON-B

# 代码解读

```import torch
from torch import nn

class MetaAconC(nn.Module):
r""" ACON activation (activate or not).
MetaAconC: (p1*x-p2*x) * sigmoid(beta*(p1*x-p2*x)) + p2*x
"""
def __init__(self, width):
super().__init__()
self.fc1 = nn.Conv2d(width, width//16, kernel_size=1, stride=1, bias=False)
self.fc2 = nn.Conv2d(width//16, width, kernel_size=1, stride=1, bias=False)

self.p1 = nn.Parameter(torch.randn(1, width, 1, 1))
self.p2 = nn.Parameter(torch.randn(1, width, 1, 1))

self.sigmoid = nn.Sigmoid()

def forward(self, x, **kwargs):
beta = self.sigmoid(self.fc2(self.fc1(x.mean(dim=2, keepdims=True).mean(dim=3, keepdims=True))))
return (self.p1 * x - self.p2 * x) * self.sigmoid( beta * (self.p1 * x - self.p2 * x)) + self.p2 * x```

# 实验

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

# 小结

0 条评论

• ### 语义分割算法之DeepLabV3+论文理解及源码解析

之前讲了DeepLabV1,V2,V3三个算法，DeepLab系列语义分割还剩下最后一个DeepLabV3+，以后有没有++,+++现在还不清楚，我们先来解读一...

• ### Pytorch实现卷积神经网络训练量化（QAT）

深度学习在移动端的应用越来越广泛，而移动端相对于GPU服务来讲算力较低并且存储空间也相对较小。基于这一点我们需要为移动端定制一些深度学习网络来满足我们的日常续需...

• ### 基于Pytorch的动态卷积复现

【GaintPandaCV导语】 最近动态卷积开始有人进行了研究，也有不少的论文发表（动态卷积论文合集https://github.com/kaijieshi7...

• ### 【C语言笔记】时间日期函数

time.h是C/C++中的日期和时间头文件。用于需要时间方面的函数。下面分享time.h头文件中几个常用函数的用法：

• ### USB OTG ID 检测原理【转】

OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上，增添了电源管理（节省功耗）功能，它允许设备既可作为主机，也可作为外设操作（两用O...

• ### USB描述符

当某个设备被连接到 USB 主机上，该设备会向主机提供其功能和电源要求。通常，设备会通过一个描述符表格（其固件的一部分）来提供这些信息。描述符表格是数据的结构化...

• ### Android 内存优化杂谈

Android 内存优化是我们性能优化工作中比较重要的一环，本文的着重总结概述降低应用运行内存的技巧。

• ### 牛客网剑指offer-2

输入一棵二叉搜索树，将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点，只能调整树中结点指针的指向。

• ### 教你一步步扣代码解出你需要找到的加密参数

上周的pdd很多人说看了还不会找，都找我要写一篇来教教如何扣代码的，那就应大家要求，今天来写一篇详细的扣代码过程，完全从零到一，如果对你有帮助，还望大力分享，这...

• ### 基于Lockset的数据竞争检测方法汇总（三）

上一篇文章中我们看到了有关共享对象状态变迁在Eraser基础上进行的改进，但是改进的不是特别明显，下面这篇论文不是单纯的用Lockset作为数据...