特征:文件夹下有一个_init.py文件
为了避免模块名冲突
一个包对应一个文件夹,将功能相近的模块(Python文件),放在同一个文件夹下
init.py 文件能将文件夹变为一个Python模块(每个模块的包中,都有__init__.py 文件,此文件内容一般为空)
- 作用:
- 便于代码复用,提高编程效率,提高了代码的可维护性
- 避免函数名和变量名冲突
激活函数(activation function):
激活函数是神经网络中输入的因素实现非线性化的数学公式,进而通过激活函数作用使神经网络拟合各种曲线
作用:
把输入信号的总和转换为输出信号的转换器
将输入的线性映射拟合为非线性值,增强神经网络的预测能力等
s t e p ( x ) = { 0 ( x ≤ 0 ) 1 ( x > 0 ) {step(x)=\begin{cases} 0 \ \ \ \ (x\le0)\\ 1\ \ \ \ (x\gt0) \\ \end{cases}} step(x)={0 (x≤0)1 (x>0)
缺点:难以体现出参数的微小变化
import numpy as np
def step_function(x):
if x > 0:
return 1
else:
return 0
if __name__ == '__main__':
# 进行数据测试
print("--" * 20)
print("阶跃函数:", step_function(0.5))
print("--" * 20)
s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)={1\over 1+e^{-x}} sigmoid(x)=1+e−x1
缺点:
激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练
sigmoid函数一般用于二元分类问题
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
if __name__ == '__main__':
# 进行数据测试
b = np.array(range(-4, 5))
print("sigmoid函数:", sigmoid(b))
print("--" * 20)
R e L U ( x ) = { x ( x > 0 ) 1 ( x ≤ 0 ) {ReLU(x)=\begin{cases} x \ \ \ \ (x\gt0)\\ 1\ \ \ \ (x\le0) \\ \end{cases}} ReLU(x)={x (x>0)1 (x≤0)
即数学中的斜坡函数 f(x)=max(0,x)
特点:
不存在梯度消失的问题:负值梯度一律取0,对于正值梯度一律为1(但会出现梯度死亡问题)
计算速度很快
import numpy as np
def relu(x):
return np.maximum(0, x)
if __name__ == '__main__':
# 进行数据测试
c = np.array(range(-4, 5))
print("ReLU函数:", relu(c))
print("--" * 20)
S o f t M a x ( x i ) = e ( x i + C ˊ ) ∑ i = 1 n ( e x i + C ˊ ) {SoftMax(x_i)={e^{({x_i}+\acute{C})}\over\sum_{i=1}^n{(e^{{x_i}+\acute{C}})}}} SoftMax(xi)=∑i=1n(exi+Cˊ)e(xi+Cˊ)
优点:
能够将差距大的数值距离拉的更大
缺点:
当输出值非常大的话,计算得到的数值也会变的非常大,数值可能会溢出
多元分类问题可以使用 softmax函数
import numpy as np
def softmax(x):
# 数据溢出处理
c = np.max(x)
exp_a = np.exp(x - c)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
if __name__ == '__main__':
# 进行数据测试
d = np.array([-5, 5, 0.1])
print("softmax函数:", softmax(d))
print("--" * 20)
T a n h ( x ) = 2 2 + 2 e − x − 1 Tanh(x)={2\over 2+2e^{-x}}-1 Tanh(x)=2+2e−x2−1
tanh = 2sigmoid(2x)-1
特点:与sigmoid函数形式相似,梯度不容易消失
tanh函数解决了Sigmoid函数不以0为中心输出的问题
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
if __name__ == '__main__':
# 进行数据测试
e = np.arange(-3, 4, 0.5)
print("Tanh双曲正切函数:", tanh(e))
print("--" * 20)
T S w i s h ( x ) = x x + x e − x TSwish(x)={x\over x+xe^{-x}} TSwish(x)=x+xe−xx
y = x * sigmoid (x)
无界性:有助于防止慢速训练期间,梯度逐渐接近 0 并导致饱和
导数恒 > 0
平滑度在优化和泛化中起了重要作用
def TSwish(x):
return x / (1 + np.exp(-x))
if __name__ == '__main__':
# 进行数据测试
f = np.arange(-3, 4, 0.5)
print("TSwish函数:", TSwish(f))
print("--" * 20)
S o f t p l u s ( x ) = l n ( 1 + e x ) Softplus(x)={ln{(1+e^{x})}} Softplus(x)=ln(1+ex)
def Softplus(x):
return np.log(1 + np.exp(x))
if __name__ == '__main__':
# 进行数据测试
g = np.arange(-3, 4, 0.5)
print("Softplus函数:", Softplus(g))
print("--" * 20)
# 绘制函数图像
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = "STXingkai"
plt.rcParams["axes.unicode_minus"] = False
# 导入阶跃函数
from Neural_Network.functions.FuncTions import trans_step_function
# 绘制阶跃函数图像
arrays = np.arange(-5, 5, 0.1)
y = trans_step_function(arrays)
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
plt.plot(arrays, y, c='c', ls='-', label='step fanction')
plt.legend(loc='upper left')
plt.title("阶跃函数图像")
plt.show()
# 导入sigmoid函数
from Neural_Network.functions.FuncTions import sigmoid
# 绘制sigmoid函数图像
arrays = np.arange(-5, 5, 0.1)
y = sigmoid(arrays)
plt.subplot(121)
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
plt.title("sigmoid函数")
plt.plot(arrays, y, ls='-')
plt.legend(["sigmoid函数"], loc='upper left', fontsize=10)
# 导数图像
plt.subplot(122)
y1 = sigmoid(arrays) * (1 - sigmoid(arrays))
plt.plot(arrays, y1, ls='-', c='y')
# 设置坐标轴
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
# 设置图例(本图无对应名称)
plt.legend(["sigmoid函数的导数"], loc='upper left', fontsize=10)
plt.title("sigmoid导数图像")
plt.show()
# ReLU函数
from Neural_Network.functions.FuncTions import relu
# 绘制ReLU函数图像
arrays = np.arange(-5, 5, 0.1)
y = relu(arrays)
plt.plot(arrays, y, c='r', ls='-')
# 设置坐标轴
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
# 设置图例(本图无对应名称)
plt.legend(["ReLU函数"], loc='upper left', fontsize=10)
plt.title("ReLU函数图像")
plt.show()
# softmax函数
from Neural_Network.functions.FuncTions import softmax
# 绘制函数图像
arrays = np.arange(-5, 5, 0.1)
y = softmax(arrays)
plt.plot(arrays, y, c='deeppink', ls='-')
# 设置坐标轴
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
# 设置图例(本图无对应名称)
plt.legend(["SoftMax函数"], loc='upper left', fontsize=10)
plt.title("SoftMax函数图像")
plt.show()
# Tanh双曲正切函数
from Neural_Network.functions.FuncTions import tanh
# 绘制函数图像
arrays = np.arange(-5, 6, 0.1)
y = tanh(arrays)
plt.subplot(121)
plt.plot(arrays, y, c='g', ls='-')
# 设置坐标轴
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
# 设置图例(本图无对应名称)
plt.legend(["Tanh双曲正切函数"], loc='upper left', fontsize=10)
plt.title("Tanh双曲正切函数")
# 导数图像
plt.subplot(122)
y1 = 1 - (tanh(arrays) * tanh(arrays))
plt.plot(arrays, y1, ls='-', c='y')
# 设置坐标轴
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
# 设置图例(本图无对应名称)
plt.legend(["anh双曲正切函数的导数"], loc='upper left', fontsize=10)
plt.title("anh双曲正切函数导数图像")
plt.show()
# Swish函数
from Neural_Network.functions.FuncTions import TSwish
# 绘制函数图像
arrays = np.arange(-5, 7, 0.1)
y = TSwish(arrays)
plt.plot(arrays, y, c='coral', ls='-')
# 设置坐标轴
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
# 设置图例(本图无对应名称)
plt.legend(["Swish函数"], loc='upper left', fontsize=10)
plt.title("Swish函数图像")
plt.show()
# Softplus函数
from Neural_Network.functions.FuncTions import Softplus
# 绘制函数图像
arrays = np.arange(-5, 7, 0.1)
y = Softplus(arrays)
plt.plot(arrays, y, c='teal', ls='-')
# 设置坐标轴
plt.xlabel("X轴", fontsize=12, color='purple', loc='right')
plt.ylabel("Y轴", loc='top', fontdict={'size': 12, 'color': 'purple'})
# 设置图例(本图无对应名称)
plt.legend(["Softplus函数"], loc='upper left', fontsize=10)
plt.title("Softplus函数图像")
plt.show()