[英]Tensorflow vs Numpy math functions
numpy和tensorflow執行的數學函數之間是否有任何真正的區別。 例如,指數函數,還是最大函數?
我注意到的唯一區別是tensorflow需要輸入張量,而不是numpy數組。 這是唯一的區別,功能結果與價值沒有區別嗎?
如前所述,存在性能差異。 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,所以這是一個因素我猜也是如此)。
當然有一個真正的區別。 Numpy適用於可以使用高度優化的矢量化計算的數組,並且它在CPU上運行良好,而tensorflow的數學函數針對GPU進行了優化,其中許多矩陣乘法更為重要。 所以問題是你想用什么。 對於CPU,我會選擇numpy,而對於GPU,使用TF操作是有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.