Tan_pytorch_segmentation/pytorch_segmentation/Activation_Function/ReLU.py

31 lines
1.9 KiB
Python
Raw Normal View History

2025-05-19 20:48:24 +08:00
"""
ReLU函数
1ReLU 函数在正输入时是线性的收敛速度快计算速度快同时符合恒等性的特点当输入为正时由于导数是1能够完整传递梯度不存在梯度消失的问题梯度饱和问题
2计算速度快ReLU 函数中只存在线性关系且无论是函数还是其导数都不包含复杂的数学运算因此它的计算速度比 sigmoid tanh 更快
3当输入大于0时梯度为1能够有效避免链式求导法则梯度相乘引起的梯度消失和梯度爆炸计算成本低
4它保留了 step 函数的生物学启发只有输入超出阈值时神经元才激活不过当输入为正的时候导数不为零从而允许基于梯度的学习尽管在 x=0 的时候导数是未定义的当输入为负值的时候ReLU 的学习速度可能会变得很慢甚至使神经元直接无效因为此时输入小于零而梯度为零从而其权重无法得到更新在剩下的训练过程中会一直保持静默
ReLU不足
1ReLU的输入值为负的时候输出始终为0其一阶导数也始终为0这样会导致神经元不能更新参数也就是神经元不学习了这种现象叫做Dead Neuron为了解决ReLU函数这个缺点在ReLU函数的负半区间引入一个泄露Leaky所以称为Leaky ReLU函数
2与Sigmoid一样其输出不是以0为中心的ReLU的输出为0或正数
3ReLU在小于0的时候梯度为零导致了某些神经元永远被抑制最终造成特征的学习不充分;这是典型的 Dead ReLU 问题所以需要改进随机初始化避免将过多的负数特征送入ReLU
"""
import torch
import torch.nn as nn
# Relu函数
print('*' * 25 + "Relu函数" + "*" * 25)
m = nn.ReLU()
input = torch.randn(2)
print("原:", input)
print("结果:", m(input))
print('*' * 50)