第三章-神经网络-激活函数

激活函数

(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()函数,该函数会从输入的数值中选择较大的那个进行输出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容