使用 Mac osx Accelerate 框架的矩阵乘法结果为 NaN

Posted

技术标签:

【中文标题】使用 Mac osx Accelerate 框架的矩阵乘法结果为 NaN【英文标题】:Matrix multiplication result in NaN by using Mac osx Accelerate framework 【发布时间】:2016-03-01 04:15:07 【问题描述】:

当我将numpy.dot 用于ndarray 时,发生了一个奇怪的现象。这是安装在我的 MacOSX 上的numpy 的信息:

'define_macros': [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)],
 'extra_compile_args': ['-msse3',
 '-I/System/Library/Frameworks/vecLib.framework/Headers'],
 'extra_link_args': ['-Wl,-framework', '-Wl,Accelerate']

假设有两个矩阵W(m, k)X(k, n)y = W.dot(X),我发现y中有一些位置是NaN。例如:y[i][j] == Nan。然后我做以下操作:

a = W[i].dot(X[:,j])

我发现a 不是Nan!此外,我还发现Nan在y中的位置在每个实验之间是不同的。

我使用相同的WX 并在另一台PC 上使用Ubuntu14.04 执行该操作,该PC 中numpy 的信息是:

'define_macros': [('ATLAS_INFO', '"\\"3.10.1\\""')],
 'include_dirs': ['/usr/include/atlas'],
 'language': 'c',
 'libraries': ['f77blas', 'cblas', 'atlas'],
 'library_dirs': ['/usr/lib/atlas-base']

y = W.dot(X)是正常的,里面没有NaN

我知道numpy.dot 是如何实现的,并且cblas_dgemm() 被称为双精度矩阵时间矩阵情况。 那么 MacOSX Accelerate 框架中是否有任何错误?


矩阵Wcaffe.convolutionLayer 中的权重blob,X 是该层的输入。我还在我的MacOSX上使用了caffe,它使用Accelerate.framework作为它的矩阵乘法库。奇怪的事情也发生了。

【问题讨论】:

您是否有机会验证是否有除零? @HarshWardhan 我做的实验只包含矩阵乘法,根本没有除法。 【参考方案1】:

如果矩阵包含零和 inf/-inf,则乘积 zero*inf 似乎被定义为 nan。 BLAS 库中似乎存在不一致,我的 (libblas3) 有时会忽略 NaN 值,并对不同大小的矩阵给出不同的结果。比较相差 AxB == trans(trans(A)*trans(B)) 的位置,其中 A 和 B 是矩阵,而 trans() 是矩阵的转置。

【讨论】:

以上是关于使用 Mac osx Accelerate 框架的矩阵乘法结果为 NaN的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV for Mac 是不是使用 Accelerate 框架?

OSX 中 MKL BLAS 和 Accelerate Framework BLAS 之间 DSCAL 的不一致

OSX 上的稀疏 BLAS

使用 Accelerate 框架对向量进行编码

MAC OSX环境下cordova+Ionic的安装配置

Accelerate框架的最小二乘函数?