激活函数
(1)阶跃函数
当输入超过0时,输出1,否则输出0
def step_function(x):
if x > 0:
return 1
else:
return 0
但是,这个函数的缺陷在于函数的输入参数只能是一个数值,而不能是NumPy数组
改进:
import numpy as np
x = np.array([-1.23,2.566,3.3344])
# 对NumPy进行不等号运算
y = x > 0
print(y)
# astype()函数用来转换NumPy数组的类型
y = x.astype(np.int)
print(y)
astype()函数用来转换NumPy数组的类型
对NumPy进行不等号运算
阶跃函数的代码实现:
# coding: utf-8
import numpy as np
import matplotlib.pylab as plt
def step_function(x):
return np.array(x > 0, dtype=np.int)
X = np.arange(-5.0, 5.0, 0.1)#从-5到5,步长为0.1
Y = step_function(X)#给阶跃函数传进NumPy数组,对每个元素做不等号运算,再以int类型输出。
plt.plot(X, Y)
plt.ylim(-0.1, 1.1) # 指定图中绘制的y轴的范围
plt.show()
阶跃函数
np.arange(-5.0, 5.0, 0.1)#从-5到5,步长为0.1
ylim(-0.1, 1.1) # 指定图中绘制的y轴的范围
(2)sigmoid函数
sigmoid函数作为激活函数
其公式为:
sigmoid function
sigmoid 函数的实现代码:
# coding: utf-8
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)
plt.show()
当输入的x是NumPy数组时,结果也能被正确计算,因为 np.exp(-x)会生成一个NumPy数组,用到了NumPy的广播功能。
(3)阶跃函数与sigmoid函数的比较
# coding: utf-8
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def step_function(x):
return np.array(x > 0, dtype=np.int)
x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(x)
y2 = step_function(x)
plt.plot(x, y1, label="sigmoid")
plt.plot(x, y2, 'k--', label="step")
plt.ylim(-0.1, 1.1) #指定图中绘制的y轴的范围
plt.title('step function & sigmoid function')
plt.legend()#用于显示各条线对应的label
plt.show()
image.png
(1)sigmoid函数的平滑性对神经网络的学习具有重要意义。
(2)这两个函数的取值范围都在0-1之间
(3)两个函数都是非线性函数
神经网络中的激活函数必须是非线性函数,否则使用线性函数,加深神经网络的层数就没有意义了。
eg:有个三层的神经网络,激活函数为:h(x)=cx, y(x)=h(h(h(x)))=cccx=c^3x.
为了发挥多层神经网络带来的优势,激活函数必须使用非线性函数。
问题:为什么神经网络的层数多一些会好?
答:
不是说仅仅层数越多效果越好,这个还取决于你的激活函数,还有各种超参数的设置等等。同意 @Eslavill 的观点,层数多了,网络表达能力更强了,第一层学习个直线,第二层学习个基本的几何图形,第三层再学习个更复杂的图形。
(4)ReLU函数(Rectified Linear Unit)
ReLU函数在输入大于0的时候,直接输出该值,在输入小于等于0时,输出0.
ReLU函数的公式为:
ReLU函数的实现代码
# coding: utf-8
import numpy as np
import matplotlib.pylab as plt
def relu(x):
return np.maximum(0, x)
x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x, y, label="ReLU")
plt.ylim(-1.0, 5.5) #指定图中绘制的y轴的范围
plt.title('ReLU')
plt.legend()#用于显示各条线对应的label
plt.show()
这里使用了NumPy的maximum()函数,该函数会从输入的数值中选择较大的那个进行输出。
网友评论