📜  ML – 谷歌在 Keras 中的 Swish函数

📅  最后修改于: 2022-05-13 01:55:10.878000             🧑  作者: Mango

ML – 谷歌在 Keras 中的 Swish函数

ReLU 长期以来一直是深度学习社区中最好的激活函数,但 Google 的大脑团队在 2017 年宣布 Swish 作为 ReLU 的替代品。论文作者的研究表明,简单地用 Swish 单元替换 ReLU 单元可以提高Inception-ResNet-v2 在 ImageNet 上的分类准确率提高了 0.6%,因此,它在许多深度神经网络中优于 ReLU。

嗖嗖激活函数:

  • 数学公式: Y = X * sigmoid(X)
  • 有界但上无界: YX处接近恒定值接近负无穷,但YX接近无穷时接近无穷。
  • Swish 的导数, Y' = Y + sigmoid(X) * (1-Y)
  • 软曲线和非单调函数。

Swish vs ReLU

相对于 RelU 激活函数的优势:

激活函数没有边界是可取的,因为它避免了梯度几乎为零时的问题。 ReLU函数在上面是有界的,但是当我们考虑下面的区域时,下面的区域可能会在一定程度上对模型进行正则化,在负无穷的限制中接近零的函数也很适合正则化,因为大的负输入被丢弃了。 swish函数提供了非单调性,增强了输入数据的表达和要学习的权重。
下面是 Swish函数在许多社区主导激活函数(如 ReLU、SeLU、Leaky ReLU 等)上的性能指标。

keras中Swish激活函数的实现:
Swish 在 Keras 中作为自定义函数实现,定义后必须在激活类中注册一个键。

代码:

# Code from between to demonstrate the implementation of Swish
  
# Our aim is to use "swish" in place of "relu" and make compiler understand it
model.add(Dense(64, activation = "relu"))
model.add(Dense(16, activation = "relu"))

现在我们将创建一个名为 Swish 的自定义函数,它可以根据 Swish 激活函数的数学公式给出如下输出:

# Importing the sigmoid function from
# Keras backend and using it
from keras.backend import sigmoid
  
def swish(x, beta = 1):
    return (x * sigmoid(beta * x))

现在,由于我们拥有可以将输入处理为 Swish 激活的自定义设计函数,因此我们需要将这个自定义对象注册到 Keras。为此,我们将它传递到一个字典中,其中包含我们想要调用它的键和它的激活函数。 Activation 类将实际构建函数。

代码:

# Getting the Custom object and updating them
from keras.utils.generic_utils import get_custom_objects
from keras.layers import Activation
  
# Below in place of swish you can take any custom key for the name 
get_custom_objects().update({'swish': Activation(swish)})

代码:实现自定义设计的激活函数

model.add(Dense(64, activation = "swish"))
model.add(Dense(16, activation = "swish"))