torch.nn中的非线性激活介绍合集——Pytorch中的非线性激活
1、nn.ELU
基本语法:
class torch.nn.ELU(alpha=1.0, inplace=False)
按元素应用 Exponential Linear Unit (ELU) 函数。
论文中描述的方法:通过指数线性单元 (ELU) 进行快速准确的深度网络学习。
ELU 定义为:
E
L
U
(
x
)
=
{
x
,
i
f
x
>
0
α
∗
(
e
x
p
(
x
)
−
1
)
,
i
f
x
≤
0
ELU(x)=\{\begin{array}{c} x, & \mathrm{if~x > 0}\\ \alpha * (exp(x)-1), & \mathrm{if x \le 0} \end{array}
ELU(x)={x,α∗(exp(x)−1),if x>0ifx≤0
Parameters 参数:
- alpha (float) – ELU 公式的 α α α值。默认值:1.0
- Inplace(bool) – 可以选择就地执行作。默认值: False
Shape: 形状:
- Input::(∗),其中 ∗表示任意数量的维度。
- Output:(∗),与输入的形状相同。
Examples: 例子:
>>> m = nn.ELU()
>>> input = torch.randn(2)
>>> output = m(input)
2、ReLU
基本语法:
class torch.nn.ReLU(inplace=False)
按元素应用修正的线性单元函数。
R
e
L
U
(
x
)
=
(
x
)
+
=
m
a
x
(
0
,
x
)
ReLU(x)=(x)^+=max(0,x)
ReLU(x)=(x)+=max(0,x)
Parameters 参数:
- Inplace (bool) – 可以选择就地执行作。默认值: False
参数说明:
- inplace=False
import torch
from torch import nn
m = nn.ReLU(inplace=False)
input = torch.randn(2)
print(input)
output = m(input)
print(input)
print(output)
此时,输入Input并未改变,而是复制了一份原始输入并在该复制上进行非线性激活:
tensor([ 1.6213, -0.0794])
tensor([ 1.6213, -0.0794])
tensor([1.6213, 0.0000])
- inplace=True
import torch
from torch import nn
m = nn.ReLU(inplace=True)
input = torch.randn(2)
print(input)
output = m(input)
print(input)
print(output)
此时,直接对原始输入数据进行非线性激活:
tensor([-0.3541, -0.6384])
tensor([0., 0.])
tensor([0., 0.])
Shape: 形状:
- Input: (∗) ,其中 ∗ 表示任意数量的维度。
- Output: (∗),与输入的形状相同。
Examples: 例子:
>>> m = nn.ReLU()
>>> input = torch.randn(2)
>>> output = m(input)
An implementation of CReLU - https://arxiv.org/abs/1603.05201
>>> m = nn.ReLU()
>>> input = torch.randn(2).unsqueeze(0)
>>> output = torch.cat((m(input), m(-input)))
3、Sigmoid
基本语法:
class torch.nn.Sigmoid(*args, **kwargs)
按元素应用 Sigmoid 函数。
S i g m o i d ( x ) = σ ( x ) = 1 1 + e x p ( − x ) Sigmoid(x)=\sigma(x)=\frac{1}{1+exp(-x)} Sigmoid(x)=σ(x)=1+exp(−x)1
Shape: 形状:
- Input: (∗),其中 ∗ 表示任意数量的维度。
- Output: (∗),与输入的形状相同。
Examples: 例子:
>>> m = nn.Sigmoid()
>>> input = torch.randn(2)
>>> output = m(input)
4、Tanh
基本语法:
class torch.nn.Tanh(*args, **kwargs)
按元素应用 Hyperbolic Tangent (Tanh) 函数。
T
a
n
h
(
x
)
=
t
a
n
h
(
x
)
=
e
x
p
(
x
)
−
e
x
p
(
−
x
)
e
x
p
(
x
)
+
e
x
p
(
−
x
)
Tanh(x)=tanh(x)=\frac{exp(x)-exp(-x)}{exp(x)+exp(-x)}
Tanh(x)=tanh(x)=exp(x)+exp(−x)exp(x)−exp(−x)
Shape: 形状:
- Input: (∗),其中 ∗ 表示任意数量的维度。
- Output: (∗),与输入的形状相同。
Examples: 例子:
>>> m = nn.Tanh()
>>> input = torch.randn(2)
>>> output = m(input)
5、LeakyReLU
基本语法:
class torch.nn.LeakyReLU(negative_slope=0.01, inplace=False)
按元素应用 LeakyReLU 函数。
L
e
a
k
y
R
e
L
U
(
x
)
=
m
a
x
(
0
,
x
)
+
n
e
g
a
t
i
v
e
s
l
o
p
e
∗
m
i
n
(
0
,
x
)
LeakyReLU(x)=max(0,x)+negative_slope*min(0,x)
LeakyReLU(x)=max(0,x)+negativeslope∗min(0,x)
or
L
e
a
k
y
R
e
L
U
(
x
)
=
{
x
,
i
f
x
≥
0
n
e
g
a
t
i
v
e
s
l
o
p
e
×
x
,
o
t
h
e
r
w
i
s
e
LeakyReLU(x)=\{\begin{array}{c}x, & \mathrm{if~x\ge0}\\ negative_slope \times x, & \mathrm{otherwise}\end{array}
LeakyReLU(x)={x,negativeslope×x,if x≥0otherwise
Parameters 参数
- negative_slope(float)– 控制负斜率的角度 (用于负输入值)。默认值:1e-2
- Inplace (bool)– 可以选择就地执行作。默认值: False
Shape: 形状:
- 输入: (∗) 其中 * 表示任意数量的附加维度
- 输出: (∗),与输入形状相同
Examples: 例子:
>>> m = nn.LeakyReLU(0.1)
>>> input = torch.randn(2)
>>> output = m(input)
5、Softplus
基本语法:
class torch.nn.Softplus(beta=1.0, threshold=20.0)
按元素应用 Softplus 函数。
S
o
f
t
p
l
u
s
(
x
)
=
1
β
∗
log
(
1
+
e
x
p
(
β
∗
x
)
)
Softplus(x)=\frac{1}{\beta}*\log(1+exp(\beta*x))
Softplus(x)=β1∗log(1+exp(β∗x))
SoftPlus 是 ReLU 函数的平滑近似值,可用于将机器的输出限制为始终为正。
为了数值稳定性,当 时
i
n
p
u
t
×
β
>
t
h
r
e
s
h
o
l
d
input×β>threshold
input×β>threshold,实现恢复为线性函数。
Parameters 参数
- beta(float) – Softplus 公式的值 β \beta β。默认值:1
- threshold(float)– 高于此值的值将恢复为线性函数。默认值:20
参数说明:
- threshold(
β
\beta
β=1)
当 i n p u t × β ≤ t h r e s h o l d input×β \le threshold input×β≤threshold时:
import torch
from torch import nn
m = nn.Softplus()
input = torch.randn(2)
print(input)
output = m(input)
print(output)
tensor([-0.2053, 0.3776])
tensor([0.5958, 0.8997])
可以验证:
S
o
f
t
p
l
u
s
(
−
0.2053
)
=
1
1
∗
log
(
1
+
e
x
p
(
1
∗
(
−
0.2053
)
)
)
=
0.595756...
Softplus(-0.2053)=\frac{1}{1}*\log(1+exp(1*(-0.2053)))=0.595756...
Softplus(−0.2053)=11∗log(1+exp(1∗(−0.2053)))=0.595756...
S
o
f
t
p
l
u
s
(
0.3776
)
=
1
1
∗
log
(
1
+
e
x
p
(
1
∗
(
0.3776
)
)
)
=
0.899665...
Softplus(0.3776)=\frac{1}{1}*\log(1+exp(1*(0.3776)))=0.899665...
Softplus(0.3776)=11∗log(1+exp(1∗(0.3776)))=0.899665...
当 i n p u t × β > t h r e s h o l d input×β > threshold input×β>threshold时:
import torch
from torch import nn
m = nn.Softplus()
input = torch.tensor([30.])
print(input)
output = m(input)
print(output)
tensor([30.])
tensor([30.])
此时恢复为线性函数
Shape: 形状:
- Input: (∗) ,其中 ∗ 表示任意数量的维度。
- Output: (∗) ,与输入的形状相同。
Examples: 例子:
>>> m = nn.Softplus()
>>> input = torch.randn(2)
>>> output = m(input)