Fork me on GitHub

Mobilenet 通道数为什么是8的整数倍?

mobilenet 中的通道数为什么要使用 _make_divisible 函数确保为 8 的整数倍?

问题

今天阅读一段 PyTorch 版的 mobilenet 时,发现了下面这个函数:

def _make_divisible(v, divisor, min_value=None):
    """
    This function is taken from the original tf repo.
    It ensures that all layers have a channel number that is divisible by 8
    It can be seen here:
    https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py
    :param v:
    :param divisor:
    :param min_value:
    :return:
    """
    if min_value is None:
        min_value = divisor
    new_v = max(min_value, int(v + divisor / 2) // divisor * divisor)
    # Make sure that round down does not go down by more than 10%.
    if new_v < 0.9 * v:
        new_v += divisor
    return new_v

_make_divisible() 函数保证输出的数可以整除 divisor,在我拿到的 mobilenet 代码里,注释清楚的说明了使用该函数使用来保证 mobilenet 所有层的通道数都可以被 8 整除,这是为什么呢?

解答

谷歌,百度了一些答案,很多都是直接讨论了一下 mobilenet 的原理,但这并没有回答上述问题,直到我发现了这个:

答案

如果仅从数学角度来考虑,是得不到答案的,“为什么保证 mobilenet 所有层的通道数都可以被 8 整除”这个问题要从计算机处理器单元的架构上考虑,按照上述文章中的说法:

在大多数硬件中,size 可以被 d = 8, 16, ... 整除的矩阵乘法比较块,因为这些 size 符合处理器单元的对齐位宽。

其实,总结起来就一句话:为了快。至于“对齐”为什么可以加快计算,我之前做结合实例写过一篇文章,可参考:为什么逐字节拷贝没有memcpy函数快?

 

原文链接:https://blog.popkx.com/why-using-_make_divisible-to-make-sure-mobilenet-channels-is-divisible-by-8/

posted @ 2021-06-21 10:16  stardsd  阅读(850)  评论(0编辑  收藏  举报