问题
今天阅读一段 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/