2017-07-31 59 views
3

numpy和tensorflow執行的數學函數之間是否存在實際差異?例如,指數函數,還是最大函數?Tensorflow vs Numpy數學函數

我注意到的唯一區別是tensorflow需要張量的輸入,而不是numpy數組。 這是唯一的區別,在功能的結果沒有差異,按價值?

+0

基於此網站顯然在性能上有所不同https://relinklabs.com/tensorflow-vs-numpy –

回答

3

如前所述,存在性能差異。 TensorFlow的優點是它可以在CPU或GPU上工作,所以如果你有一個支持CUDA的GPU,很可能TensorFlow會更快。你可以在網上找到幾個不同的比較基準,也可以用其他軟件包比如Numba或Theano。

但是,我認爲您正在討論NumPy和TensorFlow操作是否完全等價。答案是基本上是,也就是說,操作的含義是一樣的。但是,由於它們是完全獨立的庫,對所有內容都有不同的實現,所以在結果中會發現很小的差異。拿這個代碼,例如(TensorFlow 1.2.0,NumPy的1.13.1):

# Force TensorFlow to run on CPU only 
import os 
os.environ["CUDA_VISIBLE_DEVICES"] = "-1" 

import numpy as np 
import tensorflow as tf 

# float32 NumPy array 
a = np.arange(100, dtype=np.float32) 
# The same array with the same dtype in TensorFlow 
a_tf = tf.constant(a, dtype=tf.float32) 
# Square root with NumPy 
sqrt = np.sqrt(a) 
# Square root with TensorFlow 
with tf.Session() as sess: 
    sqrt_tf = sess.run(tf.sqrt(a_tf)) 

你會期望得到相當多從兩個輸出相同的,我的意思是,一個平方根聽起來不像一個畢竟是非常複雜的操作。然而,在我的電腦打印這些陣列我得到:

print(sqrt) 
>>> array([ 0.  , 1.  , 1.41421354, 1.73205078, 2.  , 
      2.23606801, 2.44948983, 2.64575124, 2.82842708, 3.  , 
      3.1622777 , 3.31662488, 3.46410155, 3.60555124, 3.7416575 , 
      3.87298346, 4.  , 4.12310553, 4.2426405 , 4.35889912, 
      4.47213602, 4.5825758 , 4.69041586, 4.79583168, 4.89897966, 
      5.  , 5.09901953, 5.19615221, 5.29150248, 5.38516474, 
      5.47722578, 5.56776428, 5.65685415, 5.74456263, 5.83095169, 
      5.91608 , 6.  , 6.08276272, 6.16441393, 6.24499798, 
      6.3245554 , 6.40312433, 6.48074055, 6.55743837, 6.63324976, 
      6.70820379, 6.78233004, 6.85565472, 6.92820311, 7.  , 
      7.07106781, 7.14142847, 7.21110249, 7.28010988, 7.34846926, 
      7.41619825, 7.48331499, 7.54983425, 7.6157732 , 7.68114567, 
      7.74596691, 7.81024981, 7.8740077 , 7.93725395, 8.  , 
      8.06225777, 8.1240387 , 8.18535233, 8.24621105, 8.30662346, 
      8.36660004, 8.42614937, 8.48528099, 8.54400349, 8.60232544, 
      8.66025448, 8.71779823, 8.77496433, 8.83176041, 8.88819408, 
      8.94427204, 9.  , 9.05538559, 9.11043358, 9.1651516 , 
      9.21954441, 9.2736187 , 9.32737923, 9.38083172, 9.43398094, 
      9.48683262, 9.53939247, 9.59166336, 9.64365101, 9.69536018, 
      9.7467947 , 9.79795933, 9.84885788, 9.89949512, 9.94987392], dtype=float32) 

print(sqrt_tf) 
>>> array([ 0.  , 0.99999994, 1.41421342, 1.73205078, 1.99999988, 
      2.23606801, 2.44948959, 2.64575124, 2.82842684, 2.99999976, 
      3.1622777 , 3.31662488, 3.46410155, 3.60555077, 3.74165726, 
      3.87298322, 3.99999976, 4.12310553, 4.2426405 , 4.35889864, 
      4.47213602, 4.58257532, 4.69041538, 4.79583073, 4.89897919, 
      5.  , 5.09901857, 5.19615221, 5.29150248, 5.38516474, 
      5.47722483, 5.56776428, 5.65685368, 5.74456215, 5.83095121, 
      5.91607952, 5.99999952, 6.08276224, 6.16441393, 6.24499846, 
      6.3245554 , 6.40312433, 6.48074055, 6.5574379 , 6.63324976, 
      6.70820427, 6.78233004, 6.85565472, 6.92820311, 6.99999952, 
      7.07106733, 7.14142799, 7.21110153, 7.28010893, 7.34846973, 
      7.41619825, 7.48331451, 7.54983425, 7.61577368, 7.68114567, 
      7.74596643, 7.81025028, 7.8740077 , 7.93725395, 7.99999952, 
      8.06225681, 8.12403774, 8.18535233, 8.24621105, 8.30662346, 
      8.36660004, 8.42614937, 8.48528099, 8.54400253, 8.60232449, 
      8.66025352, 8.71779728, 8.77496433, 8.83176041, 8.88819408, 
      8.94427204, 8.99999905, 9.05538464, 9.11043262, 9.16515064, 
      9.21954441, 9.27361774, 9.32737923, 9.38083076, 9.43398094, 
      9.48683357, 9.53939152, 9.59166145, 9.64365005, 9.69535923, 
      9.7467947 , 9.79795837, 9.84885788, 9.89949417, 9.94987392], dtype=float32) 

所以,好吧,這是類似的,但也有明顯的差異。例如,TensorFlow甚至無法正確處理1,4或9的平方根。如果你在GPU上運行它,你可能會得到一個不同的結果(由於GPU內核不同於CPU內核對NVIDIA實現的CUDA例程的依賴,這是該領域的另一個玩家)。

我的印象(雖然我可能錯了)是TensorFlow更願意犧牲一點精度來交換性能(考慮到它的典型用例,這是有意義的)。我甚至看到一些更復雜的操作產生(非常輕微)不同的結果,只是運行它兩次(在相同的硬件上),可能是由於聚合和平均操作的順序不明確導致舍入錯誤(我通常使用float32,所以這是一個因素我猜也是)。

+0

是的,我沒有在速度方面尋找性能增益,而是在數值方面有所不同。我可以說,幾乎沒有什麼區別,可以忽略不計。謝謝!我遵循你的方法來檢查3D張量的softmax激活的差異,並且幾乎沒有區別。 – Blue

+0

感謝您的回答!它幫助我調試使用numpy和tensorflow的模型中爲什麼會有細微差別。 – anon

3

當然有一個真正的區別。 Numpy適用於可以使用高度優化的矢量化計算的陣列,它在CPU上表現非常出色,而tensorflow的數學函數針對GPU進行了優化,其中許多矩陣乘法更爲重要。所以問題是你想使用什麼。對於CPU來說,我只會選擇numpy,而對於GPU來說,使用TF操作是有意義的。