【Python】Sigmoid函数和ReLU函数的图像绘制
·
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 设置中文字体(避免中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
def sigmoid(x):
"""
Sigmoid函数实现
σ(x) = 1 / (1 + e^(-x))
"""
return 1 / (1 + np.exp(-x))
def relu(x):
"""
ReLU函数实现
ReLU(x) = max(0, x)
"""
return np.maximum(0, x)
def sigmoid_derivative(x):
"""
Sigmoid函数的导数
σ'(x) = σ(x) * (1 - σ(x))
"""
s = sigmoid(x)
return s * (1 - s)
def relu_derivative(x):
"""
ReLU函数的导数
ReLU'(x) = 1 if x > 0 else 0
"""
return np.where(x > 0, 1, 0)
def plot_activation_functions():
"""
绘制激活函数图像
"""
# 创建x值范围
x = np.linspace(-10, 10, 1000)
# 创建图形
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 12))
fig.suptitle('深度学习常用激活函数可视化', fontsize=16, fontweight='bold')
# 1. Sigmoid函数
y_sigmoid = sigmoid(x)
ax1.plot(x, y_sigmoid, 'b-', linewidth=2.5, label='Sigmoid(x)')
ax1.set_title('Sigmoid函数', fontsize=14, fontweight='bold')
ax1.set_xlabel('x', fontsize=12)
ax1.set_ylabel('σ(x)', fontsize=12)
ax1.grid(True, alpha=0.3)
ax1.legend(fontsize=12)
ax1.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax1.axvline(x=0, color='k', linestyle='-', alpha=0.3)
# 添加关键点标注
ax1.plot(0, 0.5, 'ro', markersize=8, label='σ(0) = 0.5')
ax1.annotate('σ(0) = 0.5', xy=(0, 0.5), xytext=(2, 0.6),
arrowprops=dict(arrowstyle='->', color='red'),
fontsize=10, color='red')
# 2. ReLU函数
y_relu = relu(x)
ax2.plot(x, y_relu, 'r-', linewidth=2.5, label='ReLU(x)')
ax2.set_title('ReLU函数', fontsize=14, fontweight='bold')
ax2.set_xlabel('x', fontsize=12)
ax2.set_ylabel('ReLU(x)', fontsize=12)
ax2.grid(True, alpha=0.3)
ax2.legend(fontsize=12)
ax2.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax2.axvline(x=0, color='k', linestyle='-', alpha=0.3)
# 添加关键点标注
ax2.plot(0, 0, 'go', markersize=8, label='ReLU(0) = 0')
ax2.annotate('ReLU(0) = 0', xy=(0, 0), xytext=(2, 1),
arrowprops=dict(arrowstyle='->', color='green'),
fontsize=10, color='green')
# 3. Sigmoid导数
y_sigmoid_deriv = sigmoid_derivative(x)
ax3.plot(x, y_sigmoid_deriv, 'g-', linewidth=2.5, label="σ'(x)")
ax3.set_title('Sigmoid函数导数', fontsize=14, fontweight='bold')
ax3.set_xlabel('x', fontsize=12)
ax3.set_ylabel("σ'(x)", fontsize=12)
ax3.grid(True, alpha=0.3)
ax3.legend(fontsize=12)
ax3.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax3.axvline(x=0, color='k', linestyle='-', alpha=0.3)
# 标注最大值点
ax3.plot(0, 0.25, 'mo', markersize=8, label="σ'(0) = 0.25")
ax3.annotate("σ'(0) = 0.25", xy=(0, 0.25), xytext=(2, 0.2),
arrowprops=dict(arrowstyle='->', color='magenta'),
fontsize=10, color='magenta')
# 4. ReLU导数
y_relu_deriv = relu_derivative(x)
ax4.plot(x, y_relu_deriv, 'm-', linewidth=2.5, label="ReLU'(x)")
ax4.set_title('ReLU函数导数', fontsize=14, fontweight='bold')
ax4.set_xlabel('x', fontsize=12)
ax4.set_ylabel("ReLU'(x)", fontsize=12)
ax4.grid(True, alpha=0.3)
ax4.legend(fontsize=12)
ax4.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax4.axvline(x=0, color='k', linestyle='-', alpha=0.3)
# 标注不连续点
ax4.plot(0, 0, 'co', markersize=8, label='不连续点')
ax4.annotate('x=0处不连续', xy=(0, 0), xytext=(2, 0.5),
arrowprops=dict(arrowstyle='->', color='cyan'),
fontsize=10, color='cyan')
plt.tight_layout()
plt.show()
def plot_comparison():
"""
绘制两个函数的对比图
"""
# 创建x值范围
x = np.linspace(-5, 5, 1000)
# 创建图形
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
fig.suptitle('Sigmoid vs ReLU 函数对比', fontsize=16, fontweight='bold')
# 左图:函数对比
y_sigmoid = sigmoid(x)
y_relu = relu(x)
ax1.plot(x, y_sigmoid, 'b-', linewidth=2.5, label='Sigmoid(x)')
ax1.plot(x, y_relu, 'r-', linewidth=2.5, label='ReLU(x)')
ax1.set_title('函数对比', fontsize=14, fontweight='bold')
ax1.set_xlabel('x', fontsize=12)
ax1.set_ylabel('f(x)', fontsize=12)
ax1.grid(True, alpha=0.3)
ax1.legend(fontsize=12)
ax1.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax1.axvline(x=0, color='k', linestyle='-', alpha=0.3)
# 右图:导数对比
y_sigmoid_deriv = sigmoid_derivative(x)
y_relu_deriv = relu_derivative(x)
ax2.plot(x, y_sigmoid_deriv, 'g-', linewidth=2.5, label="σ'(x)")
ax2.plot(x, y_relu_deriv, 'm-', linewidth=2.5, label="ReLU'(x)")
ax2.set_title('导数对比', fontsize=14, fontweight='bold')
ax2.set_xlabel('x', fontsize=12)
ax2.set_ylabel("f'(x)", fontsize=12)
ax2.grid(True, alpha=0.3)
ax2.legend(fontsize=12)
ax2.axhline(y=0, color='k', linestyle='-', alpha=0.3)
ax2.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.tight_layout()
plt.show()
def plot_3d_surface():
"""
绘制3D表面图展示函数特性
"""
from mpl_toolkits.mplot3d import Axes3D
# 创建网格
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
# 计算函数值
Z_sigmoid = sigmoid(X)
Z_relu = relu(X)
# 创建3D图形
fig = plt.figure(figsize=(15, 6))
# Sigmoid 3D图
ax1 = fig.add_subplot(121, projection='3d')
surf1 = ax1.plot_surface(X, Y, Z_sigmoid, cmap='viridis', alpha=0.8)
ax1.set_title('Sigmoid函数3D视图', fontsize=14, fontweight='bold')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_zlabel('σ(x)')
fig.colorbar(surf1, ax=ax1, shrink=0.5, aspect=5)
# ReLU 3D图
ax2 = fig.add_subplot(122, projection='3d')
surf2 = ax2.plot_surface(X, Y, Z_relu, cmap='plasma', alpha=0.8)
ax2.set_title('ReLU函数3D视图', fontsize=14, fontweight='bold')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_zlabel('ReLU(x)')
fig.colorbar(surf2, ax=ax2, shrink=0.5, aspect=5)
plt.tight_layout()
plt.show()
def analyze_functions():
"""
分析函数特性并打印结果
"""
print("=" * 60)
print("激活函数特性分析")
print("=" * 60)
# 测试点
test_points = [-5, -2, -1, 0, 1, 2, 5]
print("\nSigmoid函数分析:")
print("-" * 30)
print(f"函数公式: σ(x) = 1 / (1 + e^(-x))")
print(f"导数公式: σ'(x) = σ(x) * (1 - σ(x))")
print("\n测试点结果:")
for x in test_points:
y = sigmoid(x)
y_deriv = sigmoid_derivative(x)
print(f"x = {x:3d}: σ(x) = {y:.6f}, σ'(x) = {y_deriv:.6f}")
print("\nReLU函数分析:")
print("-" * 30)
print(f"函数公式: ReLU(x) = max(0, x)")
print(f"导数公式: ReLU'(x) = 1 if x > 0 else 0")
print("\n测试点结果:")
for x in test_points:
y = relu(x)
y_deriv = relu_derivative(x)
print(f"x = {x:3d}: ReLU(x) = {y:6.3f}, ReLU'(x) = {y_deriv}")
print("\n函数特性对比:")
print("-" * 30)
print("Sigmoid函数:")
print(" ✓ 输出范围: (0, 1)")
print(" ✓ 中心对称: σ(0) = 0.5")
print(" ✓ 平滑可导")
print(" ✗ 梯度消失问题")
print(" ✗ 输出非零中心")
print("\nReLU函数:")
print(" ✓ 计算简单高效")
print(" ✓ 缓解梯度消失")
print(" ✓ 稀疏激活")
print(" ✗ 负区间梯度为0 (Dead ReLU)")
print(" ✗ 输出非零中心")
if __name__ == "__main__":
# 运行分析
analyze_functions()
# 绘制图像
print("\n正在绘制函数图像...")
plot_activation_functions()
print("\n正在绘制对比图像...")
plot_comparison()
print("\n正在绘制3D图像...")
plot_3d_surface()
print("\n绘图完成!")

更多推荐
所有评论(0)