使用 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中的位置在每个实验之间是不同的。
我使用相同的W
和X
并在另一台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 框架中是否有任何错误?
矩阵W
是caffe.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 框架?