YOLOX-SiLU Relu LeakyRelu

# 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


已发布

分类

来自

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注