神经网络|(十二)|常见激活函数

【1】引言

前序学习进程中,已经了解到神经网络的实际运算过程找那个,会使用激活函数。相关文章链接包括且不限于:

python学智能算法(六)|神经网络算法:BP神经网络算法入门-CSDN博客

神经网络|(十一)|神经元和神经网络-CSDN博客

在此基础上,本篇文章集中学习一些常见的激活函数。

【2】激活函数

【2.1】线性激活函数

线性激活函数为:

线性激活函数对应的代码为:

python 复制代码
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

t=np.linspace(-5,5,100) #定义自变量
y=t #定义因变量

plt.plot(t,y,label='y=x') #绘图
plt.title('Y=X') #设置图名
plt.xlabel('X') #设置X轴名称
plt.ylabel('Y') #设置Y轴名称
plt.legend() #显示标签
plt.show() #显示图像

代码运行后的图像为:

++图1 线性激活函数++

【2.2】阶跃激活函数

阶跃激活函数为:

需要注意的是,这里随机取了一个判断标准0.5,实际情况可能是大于等于任何数。

阶跃激活函数对应的代码为:

python 复制代码
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

t=np.linspace(-5,5,100) #定义自变量
y1=[] #定义列表y1

# 当自变量大于判断开关时,列表里添加1,否则添加0
for i in t:
    if i>=0.5:
        y1.append(1)
    else:
        y1.append(0)
# 把y1从列表转化为数组,这样就能和t一一对应
y1=np.array(y1)

plt.plot(t,y1,label='y1') #绘图
plt.title('阶跃函数') #设置图名
plt.xlabel('X') #设置X轴名称
plt.ylabel('Y') #设置Y轴名称
plt.legend() #显示标签
plt.show() #显示图像

代码运行后的图像为:

++图2 阶跃激活函数++

【2.3】S型激活函数

S型激活函数为:

S型激活函数对应的代码为:

python 复制代码
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

t=np.linspace(-5,5,100) #定义自变量
y2=1/(1+np.exp(-t)) #定义因变量

plt.plot(t,y2,label='S型函数') #绘图
plt.title('S型激活函数') #设置图名
plt.xlabel('X') #设置X轴名称
plt.ylabel('Y') #设置Y轴名称
plt.legend() #显示标签
plt.show() #显示图像

代码运行后的图像为:

++图3 S型激活函数++

【2.4】双曲正切激活函数

双曲正切激活函数为:

双曲正切激活函数代码为:

python 复制代码
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

t=np.linspace(-5,5,100) #定义自变量
y3=np.tanh(t) #定义因变量

plt.plot(t,y3,label='双曲正切函数') #绘图
plt.title('双曲正切激活函数') #设置图名
plt.xlabel('X') #设置X轴名称
plt.ylabel('Y') #设置Y轴名称
plt.legend() #显示标签
plt.show() #显示图像

代码运行后的图像为:

++图4 双曲正切激活函数++

【2.5】修正线性单元ReLu激活函数

修正线性单元ReLu激活函数为:

修正线性单元ReLu激活函数代码为:

python 复制代码
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

t=np.linspace(-5,5,100) #定义自变量

#定义修正线性单元ReLu激活函数
def ReLu(x):
    return np.maximum(0,x) #大于0取x,小于等于0取0
y4=ReLu(t) #定义因变量

plt.plot(t,y4,label='修正线性单元ReLu函数') #绘图
plt.title('修正线性单元ReLu激活函数') #设置图名
plt.xlabel('X') #设置X轴名称
plt.ylabel('Y') #设置Y轴名称
plt.legend() #显示标签
plt.show() #显示图像

代码运行后的图像为:

++图5 修正线性单元ReLu激活函数++

【2.6】Softmax激活函数

Softmax激活函数为:

Softmax激活函数代码为:

python 复制代码
import numpy as np  #引入numpy模块
import matplotlib.pyplot as plt  #引入matplotlib模块

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

# 定义Softmax函数
def softmax(x):
    """
    计算输入向量x的Softmax值
    :param x: 输入的实数向量
    :return: Softmax变换后的概率分布向量
    """
    exp_x = np.exp(x) #计算当前值
    return exp_x / np.sum(exp_x, axis=0) #计算当前值所占的比例

# 生成示例输入数据
x = np.linspace(-10, 10, 100)
# 模拟多个神经元的输入
# 每一次的组成都是三个变量
inputs = np.vstack([x, 0.5 * x, 0.2 * x])

# 计算Softmax输出
# Softmax计算三个变量各自所占的比例
outputs = softmax(inputs)

# 绘制Softmax变化规律图
plt.figure(figsize=(10, 6))
for i in range(outputs.shape[0]):
    plt.plot(x, outputs[i], label=f'变量 {i+1}所占比例')

plt.title('Softmax激活函数') #设置图名
plt.xlabel('X') #设置X轴名称
plt.ylabel('Y') #设置Y轴名称
plt.legend() #显示标签
plt.grid(True) #显示网格
plt.show() #显示图像

代码运行后的图像为:

++图6 Softmax激活函数++

Softmax激活函数实际上代表了各个输入变量所占的比例,每个X轴取值上,三个变量所占的比例综合恒为1。

为了突出对比便于理解,把除了Softmax函数以外的函数全部画到一起:

python 复制代码
import numpy as np #引入numpy模块
import matplotlib.pyplot as plt #引入matplotlib模块

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示为方块的问题

t=np.linspace(-5,5,100) #定义自变量
y=t

y1=[]
for i in t:
    if i>=0.5:
        y1.append(1)
    else:
        y1.append(0)
y1=np.array(y1)

y2=1/(1+np.exp(-t))

y3=np.tanh(t)


def ReLu(x):
    return np.maximum(0,x)

y4=ReLu(t)

plt.plot(t,y,label='线性函数')
plt.plot(t,y1,label='阶跃函数')
plt.plot(t,y2,label='S型函数')
plt.plot(t,y3,label='双曲正切函数')
plt.plot(t,y4,label='修正线性单元ReLu函数')

plt.title('激活函数')
plt.xlabel('X') #设置X轴名称
plt.ylabel('Y') #设置Y轴名称
plt.legend() #显示标签
plt.show() #显示图像

获得的图像为:

++图7 Softmax以外激活函数对比++

【3】总结

学习了常用的激活函数,通过python对激活函数进行了绘制。

相关推荐
B博士13 小时前
科研进展 | JAG: 大光斑高光谱激光雷达遥感辐射传输模型从垂直视角解锁森林叶绿素分布密码
人工智能·jag·高光谱激光雷达·森林分层叶绿素诊断
Yao.Li14 小时前
PVN3D ORT CUDA Custom Ops 实现与联调记录
人工智能·3d·具身智能
诺伦14 小时前
LocalClaw 在智能制造的新机会:6部门AI+电商政策下的工厂AI升级方案
人工智能·制造
小陈工16 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬21 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志21 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_9481142421 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠21 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光21 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好21 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型