YOLOv4 中的 Mish 激活函数
本文转载自AI公园。
作者:Miracle R 编译:ronghuaiyang
导读
对YOLOv4中的Mish激活函数进行解释和优缺点对比。
YOLO,是一种 one-shot 的目标检测技术,由Joseph Redmon和Ali Farhadi在2016年引入,目前已经有4个版本的技术。在这里,我们会来看看YOLOv4,特别是它的优化器,使用的两个bags的优化函数:在训练期间使用的“Bag of Freebies (BoF)”和在推理期间使用的“Bag of Specials (BoS)”。
Bag of Specials包含了用于YOLOv4架构的主干和检测器的低计算成本模块。这些是:
在这里,我们可以看到Mish激活函数同时存在于主干和检测器中。那么,是什么让它“special”呢?让我们进一步了解这个激活函数。
Mish激活函数
Mish是光滑的非单调激活函数,可定义为:
f(x) = x・tanh(ς(x))
其中, ς(x) = ln(1+e^x),是一个softmax激活函数和。
这与另一个被称为Swish函数的激活函数非常相似,可以定义为:
在YOLOv4中使用Mish函数的原因是它的低成本和它的平滑、非单调、上无界、有下界等特点,与其他常用函数如ReLU和Swish相比,提高了它的性能。
Mish的性能详细说明如下:
- 无上界有有界:无上界是任何激活函数都需要的特性,因为它避免了导致训练速度急剧下降的梯度饱和。因此,加快训练过程。无下界属性有助于实现强正则化效果(适当的拟合模型)。(Mish的这个性质类似于ReLU和Swish的性质,其范围是[≈0.31,∞))。
- 非单调函数:这种性质有助于保持小的负值,从而稳定网络梯度流。大多数常用的激活函数,如ReLU [f(x) = max(0, x)], Leaky ReLU [f(x) = max(0, x), 1],由于其差分为0,不能保持负值,因此大多数神经元没有得到更新。
- 无穷阶连续性和光滑性:Mish是光滑函数,具有较好的泛化能力和结果的有效优化能力,可以提高结果的质量。在图中,可以看到ReLU和Mish之间的一个随机初始化的神经网络在宏观平滑度上的剧烈变化。然而,在Swish和Mish的情况下,宏观上或多或少还是相似的。
- 计算量较大,但是效果更好:与ReLU相比,它的计算比较贵,但在深度神经网络中显示了比ReLU更好的结果。
![](Mish Activation Function In YOLOv4.assets/0_PJVEahgbKstqbgAd.png)
- 自门控:此属性受到Swish函数的启发,其中标量输入被提供给gate。它优于像ReLU这样的点式激活函数,后者只接受单个标量输入,而不需要更改网络参数。
Python实现
使用PyTorch可以在python中实现Mish函数,如下所示:
![0_93iwe6BzbP6VRSAj](Mish Activation Function In YOLOv4.assets/0_93iwe6BzbP6VRSAj.png)import torch
import torch.nn as nn
import torch.nn.functional as Fclass Mish(nn.Module):
def __init__(self):
super().__init__()
def forward(self, x):
return x*(torch.tanh(F.softplus(x)))
总结
在诸如CIFAR-10, CIFAR-100, CalTech-256, ASL等具有挑战性的数据集的70多个不同的问题标准中,Mish函数的表现超过了广泛使用的激活函数,如ReLU和Swish。下图显示了Mish、Swish和ReLU在不同模型的CIFAR-10数据集上的性能,从图中可以很容易地推断,Mish比Swish函数的性能大约高0.494%,ReLU比Swish函数的性能高1.671%,因此是三者中最准确的:
在YOLOv4中,使用了Mish函数+ CSPDarknet53的组合,尽管代价有点高,但它极大地提高了检测的准确性,因此使Mish成为**“Specials”**之一。
—END—
英文原文:
https://medium.com/clique-org/mish-activation-function-in-yolov4-49d2f30c6bb3
END
备注:CV
- 解耦---Hybrid H5跨平台性思考
- GO语言异常处理机制panic和recover分析
- WordPress前端html代码压缩优化,附对应知更鸟主题压缩报错的解决方案
- 原创插件:网站收录查询和显示WordPress插件(自定义栏目优化版)
- Linux系统crontab备份数据库执行不成功?可能是百分号%在作怪!
- go语言十大排序算法总结
- BaiduSubmit:度娘WordPress结构化数据插件(改进版)
- Android自绘动画实现与优化实战——以Tencent OS录音机波形动画为实例
- Go语言归并排序算法实现
- grep无法查找shell传过来的变量?先注意一下文本格式吧!
- 深入浅出 Retrofit,这么牛逼的框架你们还不来看看?
- nwui —— 又一个go语言图形界面解决方案
- Golang 通用连接池
- 解决JS操作Cookies出现的乱码问题,修复WordPress评论乱码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python函数——字符串字母大小判断
- Day 6:旋转数组的最小数字
- MapReduce工作笔记——yarn reducer 内存溢出 beyond physical memory limits
- Linux实用技巧——find查找指定时间内修改过的文件或目录
- 数据结构算法操作试题(C++/Python)——最接近的三数之和
- 数据结构算法操作试题(C++/Python)——字符串转换整数 (atoi)
- 数据结构算法操作试题(C++/Python)——电话号码的字母组合
- 数据结构算法操作试题(C++/Python)——删除链表的倒数第N个节点
- Day 7:斐波那契数列
- Day8 :跳台阶
- Linux Signal 一网打尽
- Day9 :变态跳台阶
- Day10 :矩形覆盖
- vue3.0新特性初体验(二)
- 数据结构算法操作试题(C++/Python)——有效的括号