我在efficientnet上阅读代码时,被它的巧妙想法所震惊。但我不太明白它是如何调整频道数量的。
def round_filters(filters, width_coefficient, depth_divisor):
filters *= width_coefficient
new_filters = int(filters + depth_divisor / 2) // depth_divisor * depth_divisor
new_filters = max(depth_divisor, new_filters)
# Make sure that round down does not go down by more than 10%.
if new_filters < 0.9 * filters:
new_filters += depth_divisor
return int(new_filters)
我知道通道的数量必须通过宽度因子来调整,但是为什么我要这样做呢?什么是depth_divisor
发布于 2020-04-02 18:27:49
它使得缩放后的宽度可以被depth_divisor
整除。您可以将缩放宽度四舍五入为depth_divisor
的最接近倍数,但需要额外考虑(当下降超过10%时向上舍入)。在各种MobileNets和EfficientNets中该函数的几乎所有应用程序中,depth_divisor都是8。
为什么是8?主要是由于GPU和TPU等常见硬件加速器的限制。请参阅最近的cuDNN开发人员指南,并计算“8的倍数”、“32的倍数”等指导原则,以优化某些操作的性能:
https://docs.nvidia.com/deeplearning/sdk/cudnn-developer-guide/index.html
对于*_ALGO_WINOGRAD_NONFUSED以外的算法,当满足以下要求时,cuDNN库将触发张量核操作:
https://stackoverflow.com/questions/60583868
复制相似问题