2023年4月15日
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