激活函数python代码
最近在写毕业论文,其中需要介绍一些基础的激活函数,然后如果直接用matplot绘图其绘图结果不是矢量图,而且不能像Origin一样修改线条,坐标轴之类的,但是如果像用Origin画就需要生成横纵坐标的数据然后放到Origin中,其实这个过程还是有点麻烦,接下来我文中的图,就是用python生成数据之后然后复制到Origin中得到的绘图结果。要是用框架中的代码还需要转换成Tensor的张量格式,因此手动用基础库编写,且不会给所有代码堆到一起要一个一个分开看。
文章目录
- 激活函数python代码
- 函数代码部分
- 1.sigmoid
- 2.tanh
- 3.ReLU
- 4.LeaklyReLU
- 5.ReLU6
- 6.Swish
- 7.Hard-Swish
- 8.Hard-Sigmoid
- 生成绘图数据部分
- 总结
首先介绍激活含糊代码和函数图像,然后介绍如何生成绘图数据
函数代码部分
1.sigmoid
sigmoid函数将数据映射到
(
0
,
1
)
(0,1)
(0,1)之间,公式如下
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x) = \frac{1}{1 + e^{-x}}
σ(x)=1+e−x1
python代码如下
sigmoid = lambda x: 1/(1+np.exp(-x))
2.tanh
tanh激活函数将数据映射到 ( − 1 , 1 ) (-1,1) (−1,1)之间
tanh
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
tanh(x)=ex+e−xex−e−x
python代码为
tanh = lambda x: (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
3.ReLU
ReLU激活函数大于0原样输出,小于0被截至
R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x)
import numpy as np
def relu(x):
y = x.copy()
y[np.where(x<0)] = 0
return y
4.LeaklyReLU
ReLU的改进版小于0时不截至,乘以一个系数
α
\alpha
α公式如下。
L
e
a
k
y
R
e
L
U
(
x
)
=
{
x
,
if
x
>
0
α
x
,
if
x
≤
0
LeakyReLU(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x, & \text{if } x \leq 0 \end{cases}
LeakyReLU(x)={x,αx,if x>0if x≤0
import numpy as np
def leaklyrelu(x,alpha=0.01):
y = x.copy()
y[np.where(x<0)] = y[np.where(x<0)]*alpha
return y
5.ReLU6
ReLU的另一种变体,将输出值限制在
(
0
,
6
)
(0,6)
(0,6)之间
R
e
L
U
6
(
x
)
=
m
i
n
(
m
a
x
(
0
,
x
)
,
6
)
ReLU6(x)=min(max(0,x),6)
ReLU6(x)=min(max(0,x),6)
import numpy as np
def relu6(x):
y = x.copy()
y[np.where(x<0)] = 0
y[np.where(x>6)] = 6
return y
6.Swish
一种谷歌团队提出的用于替代ReLU的激活函数,函数图像是联系可导的,就是给Sigmoid函数乘以了一个x
S
w
i
s
h
(
x
)
=
x
⋅
σ
(
x
)
Swish(x)=x\cdot \sigma(x)
Swish(x)=x⋅σ(x)
swish = lambda x: x/(1+np.exp(-x))
7.Hard-Swish
ReLU6的变体,对
x
∈
[
−
3
,
3
]
x\in[-3,3]
x∈[−3,3]提供非线性激活
H
a
r
d
S
w
i
s
h
(
x
)
=
x
⋅
R
e
L
U
6
(
x
+
3
)
6
HardSwish(x)=x\cdot \frac{ReLU6(x+3)}{6}
HardSwish(x)=x⋅6ReLU6(x+3)
import numpy as np
def relu6(x):
y = x.copy()
y[np.where(x<0)] = 0
y[np.where(x>6)] = 6
return y
hard_swish = lambda x: x*(relu6(x+3)/6)
8.Hard-Sigmoid
用一种分段函数替代Sigmoid函数,类似于一种简化版的Sigmoid
H
a
r
d
S
i
g
m
o
i
d
(
x
)
=
m
a
x
(
0
,
m
i
n
(
1
,
x
+
1
2
)
)
HardSigmoid(x)=max(0,min(1,\frac{x+1}{2}))
HardSigmoid(x)=max(0,min(1,2x+1))
import python
def hardsigmoid(x):
y = x.copy()
y = (x+1)/2
y[np.where(y>1)] = 1
y[np.where(y<0)] = 0
return y
生成绘图数据部分
上面的图我是使用Origin实现的绘图,其中要获得两列的数据一列是
x
x
x一列是激活函数的输出值
f
(
x
)
f(x)
f(x)
以sigmoid为例,x为输入,y为输出
import numpy as np
sigmoid = lambda x: 1 / (1 + np.exp(-x))
x = np.linspace(-5, 5, 100)
y = sigmoid(x)
接下来需要Spyder和Origin
打开Origin默认初始化一个Sheet,我屏幕27寸截图确实显得自小,但是我觉得还是截的完全比较好
然后在Spyder中随便建一个临时文件,然后F5运行,或者点上面的绿色小三角运行,在右侧的变量菜单里找到存储的x,y两个变量,点击一个变量y
弹出以下窗口,然后点击第0列的编号也就是箭头所指向的位置
变成蓝色就是选中了,然后按住Crtl+C复制,这里右键是没有显示的
然后打开Origin粘到Sheet里,由于我们先复制了函数值y所以粘到了第二列
然后x同理复制过来,之后点击菜单栏的绘图
然后在2D基础绘图中选择折线图
然后在图标绘制中选择折线图的X,Y数据
然后点确认就得到了一个基础的Sigmoid图
然后根据自己的需要改坐标轴位置,加网络,换线段的颜色就可以了,我这里主要是开个网格,然后移动了坐标轴,还有加粗了线段和改了颜色,就不详细展开了,不然我这标题就起的不对了(笑),等下一篇再介绍具体步骤。
总结
输入数据需要是arrray数组,然后除了ReLU6选[-5,10]其他映射区间都选[-5,5]就好