簡體   English   中英

Tensorflow vs Numpy數學函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM