码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2021-06-21 20:29:18      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:UNC   blob   tps   一句话   github   repo   value   net   pytorch   

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/

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

标签:UNC   blob   tps   一句话   github   repo   value   net   pytorch   

原文地址:https://www.cnblogs.com/sddai/p/14911547.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!