# SiLU的全称是Sigmoid Linear Unit,是一个激活函数,它的计算公式为:
# SiLU(x) = x * sigmoid(x)
# SiLU的计算公式与ReLU的计算公式非常相似,但是SiLU的导数不是常数,而是一个函数
# 这个函数的值在0.5左右,这个值比ReLU的导数要大,所以SiLU的导数比ReLU的导数要大,这样就可以让模型的训练更加稳定。
class SiLU(nn.Module):
"""export-friendly version of nn.SiLU()"""
@staticmethod # 静态方法,不需要传入self参数
def forward(x):
return x * torch.sigmoid(x) # 计算公式为x*sigmoid(x)
# sigmoid函数的计算公式为1/(1+e^(-x))
# sigmoid函数的导数为sigmoid(x)*(1-sigmoid(x))
def get_activation(name="silu", inplace=True):
if name == "silu":
module = nn.SiLU(inplace=inplace) # SiLU激活函数,计算公式为x*sigmoid(x)
# SiLU是在yolov5中C3中使用的
elif name == "relu":
module = nn.ReLU(inplace=inplace) # ReLU激活函数,计算公式为max(0,x)
elif name == "lrelu":
module = nn.LeakyReLU(0.1, inplace=inplace)
# Leaky的中文意思是“漏水的”,LeakyReLU的意思是“漏水的ReLU”,LeakyReLU的计算公式为max(0.1*x,x)
# LeakyReLU是在yolov5中CSPDarknet中使用的
else:
raise AttributeError("Unsupported act type: {}".format(name))
return module
# ReLU激活函数的导数为1,LeakyReLU激活函数的导数为0.1,SiLU激活函数的导数为0.5左右
# Q: 为什么激活函数的导数越大,模型的训练越稳定?
# A: 因为梯度的值越大,模型的训练越稳定,梯度的值越小,模型的训练越不稳定
代码层面如上,想通过公式与图像认识激活函数可以访问:https://ai-scholar.tech/zh/articles/survey/activation-functions-review
发表回复