Tan_pytorch_segmentation/pytorch_segmentation/Activation_Function/ReLU.py

31 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
ReLU函数
1、ReLU 函数在正输入时是线性的收敛速度快计算速度快同时符合恒等性的特点。当输入为正时由于导数是1能够完整传递梯度不存在梯度消失的问题梯度饱和问题
2、计算速度快。ReLU 函数中只存在线性关系且无论是函数还是其导数都不包含复杂的数学运算,因此它的计算速度比 sigmoid 和 tanh 更快。
3、当输入大于0时梯度为1能够有效避免链式求导法则梯度相乘引起的梯度消失和梯度爆炸计算成本低。
4、它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为零,从而允许基于梯度的学习(尽管在 x=0 的时候导数是未定义的。当输入为负值的时候ReLU 的学习速度可能会变得很慢,甚至使神经元直接无效,因为此时输入小于零而梯度为零,从而其权重无法得到更新,在剩下的训练过程中会一直保持静默。
ReLU不足
1、ReLU的输入值为负的时候输出始终为0其一阶导数也始终为0这样会导致神经元不能更新参数也就是神经元不学习了这种现象叫做“Dead Neuron”。为了解决ReLU函数这个缺点在ReLU函数的负半区间引入一个泄露Leaky所以称为Leaky ReLU函数。
2、与Sigmoid一样其输出不是以0为中心的ReLU的输出为0或正数
3、ReLU在小于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)