在读上篇EfficientDet时,看到的EfficientNet,当时对其放缩网络感到疑惑,现在仔细看一下这个论文。
论文链接:https://arxiv.org/pdf/1905.11946.pdf
代码:https://github.com/lukemelas/EfficientNet-PyTorch
论文很简明的说明了其思想:增加网络深度、宽度以及增大图像分辨率都可以提高准确率, 但是当增大到一定程度时,准确率提升非常缓慢,直至不再提升,甚至可能下降。作者认为,网络的深度、宽度以及分辨率之间存在着相互联系,因此因此作者设置了几个可学习的参数,让网络去学习这些参数,但是又不能无限制的扩大网络,因此得设置一个上限,这就得到了公式:
再看网络结构,可视化一下看得更清晰是叭:
看代码时有个疑问,是utils.py代码注释里的,在212行,这里关于卷积后输出特征的大小:
class Conv2dDynamicSamePadding(nn.Conv2d):
"""2D Convolutions like TensorFlow, for a dynamic image size.
The padding is operated in forward function by calculating dynamically.
"""
# Tips for 'SAME' mode padding.
# Given the following:
# i: width or height
# s: stride
# k: kernel size
# d: dilation
# p: padding
# Output after Conv2d:
# o = floor((i+p-((k-1)*d+1))/s+1)
# If o equals i, i = floor((i+p-((k-1)*d+1))/s+1),
# => p = (i-1)*s+((k-1)*d+1)-i
看下这里面的Output after Conv2d,再来看pytorch文档里的:
为何文档里是2Padding,而这个代码里则是p,开始以为是pytorch文档的padding mod是 zero而代码里是same的原因,但是又搜到
后来仔细看代码,原来是代码中的p需要分成两半用,即:pytorch文档里的padding是左右分开说的,而这个代码里是整个padding。