2016-03-01 40 views
1

當我使用numpy.dot代替ndarray時,出現了一個奇怪的現象。這是安裝在我的MacOSX的numpy的信息:使用Mac osx加速框架在NaN中的矩陣乘法結果

{'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),我發現有在yNaN一些位置。例如:y[i][j] == Nan。然後我做以下操作:

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

而且我發現a不是Nan!此外,我還發現y中的Nan的位置是每個實驗之間的差異。

我用同樣的WX,做該操作在另一臺PC與Ubuntu14.04numpy的在PC上的信息是:

{'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重量斑點,並X是輸入到該層。我還在我的MacOSX上使用了caffe,它使用Accelerate.framework作爲它的矩陣乘法庫。奇怪的事情也發生了。

+0

你有沒有機會驗證是否有零除? –

+0

@HarshWardhan我所做的實驗只包含矩陣乘法,根本沒有劃分。 – dremaingo

回答

0

如果矩陣包含零和inf/-inf,那麼產品零* inf似乎被定義爲nan。在BLAS庫中似乎存在不一致性,我的(libblas3)有時省略了NaN值,併爲不同大小的矩陣提供了不同的結果。比較AxB == trans(trans(A)* trans(B))不同的位置,其中A和B是矩陣,trans()是矩陣的轉置。