Python搭建神经网络部分常用激活函数及Python包结构

激活函数模块创建

    • 1. Python包和模块的创建
        • 1.1 Python包(Package)
        • 1.2 Python模块(Module)
    • 2. 神经网络常用激活函数
        • 2.1 阶跃函数step function
        • 2.2 sigmoid函数
        • 2.3 ReLU函数(Rectified Linear Unit---线性整流函数)
        • 2.4 SoftMax函数(归一化指数函数)
        • 2.5 Tanh双曲正切函数
        • 2.6 TSwish函数
        • 2.7 Softplus 函数

1. Python包和模块的创建

1.1 Python包(Package)

  • 包: 内含__init__.py和其他功能相近的Python文件的文件夹及文件组合

特征:文件夹下有一个_init.py文件

为了避免模块名冲突
一个包对应一个文件夹,将功能相近的模块(Python文件),放在同一个文件夹下

init.py 文件能将文件夹变为一个Python模块(每个模块的包中,都有__init__.py 文件,此文件内容一般为空)

  • 子包: 子目录中也有__init_.py文件

1.2 Python模块(Module)

  • 模块: 是一个python文件(.py),拥有多个功能相近的函数或类
  • 作用:
  1. 便于代码复用,提高编程效率,提高了代码的可维护性
  2. 避免函数名和变量名冲突
  • Python包文件结构图
tow
one
__init__.py
包含
__init__.py
子包
子包模块
子包.py文件
包模块
包.py文件
  • 文件级别
    Python搭建神经网络部分常用激活函数及Python包结构_第1张图片

2. 神经网络常用激活函数

  • 激活函数(activation function):
    激活函数是神经网络中输入的因素实现非线性化的数学公式,进而通过激活函数作用使神经网络拟合各种曲线

  • 作用:
    把输入信号的总和转换为输出信号的转换器
    将输入的线性映射拟合为非线性值,增强神经网络的预测能力等

2.1 阶跃函数step 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    (x0)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)
  • 函数图像
    Python搭建神经网络部分常用激活函数及Python包结构_第2张图片

2.2 sigmoid函数

  • 数学公式

s i g m o i d ( x ) = 1 1 + e − x sigmoid(x)={1\over 1+e^{-x}} sigmoid(x)=1+ex1

  • 函数特点:
    sigmoid函数的导数在任何地方都不为0
    sigmoid是平滑曲线,输出随输入连续变化的0,1之间的实值
  • 函数原型:
    分类时样本属于该类别的各分类特征的概率,将输入转化为概率值
    Sigmoid函数是一个有着优美S形曲线的数学函数

缺点:
激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练

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)
  • 函数图像及导数图像
    Python搭建神经网络部分常用激活函数及Python包结构_第3张图片
  • step function 和sigmoid的相同点:
  1. 都是非线性函数
  2. 虽然平滑性不同,但宏观上看的形状是相似的,均为“输入小则输出接近0,输入大则输出接近1”
  3. 输出均在0和1之间

2.3 ReLU函数(Rectified Linear Unit—线性整流函数)

  • 数学表达式

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    (x0)

即数学中的斜坡函数 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)
  • 函数图像
    Python搭建神经网络部分常用激活函数及Python包结构_第4张图片

2.4 SoftMax函数(归一化指数函数)

  • 数学表达式

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)
  • 函数图像
    Python搭建神经网络部分常用激活函数及Python包结构_第5张图片

2.5 Tanh双曲正切函数

  • 数学表达式

T a n h ( x ) = 2 2 + 2 e − x − 1 Tanh(x)={2\over 2+2e^{-x}}-1 Tanh(x)=2+2ex21

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)
  • 函数图像
    Python搭建神经网络部分常用激活函数及Python包结构_第6张图片

2.6 TSwish函数

  • 数学表达式

T S w i s h ( x ) = x x + x e − x TSwish(x)={x\over x+xe^{-x}} TSwish(x)=x+xexx

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)
  • 函数图像
    Python搭建神经网络部分常用激活函数及Python包结构_第7张图片

2.7 Softplus 函数

  • 数学表达式

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)

  • Softplus相当与ReLu的平滑
    同ReLU一样是单边抑制,且存在宽广的接受域(0,+inf),涉及指数运算,对数运算一般计算量过大(使用的人较少)
  • 代码实现
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)
  • 函数图像
    Python搭建神经网络部分常用激活函数及Python包结构_第8张图片
  • 函数图像绘图代码
# 绘制函数图像

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()

你可能感兴趣的:(python,神经网络,人工智能)