2017-07-31 8 views
3

はnumpyのとtensorflowによって実行される数学関数との間の実質的な違いはあります。たとえば、指数関数、または最大関数?Tensorflow numpyの対数学関数

私が気づいた唯一の違いは、tensorflowがnumpyの配列をテンソルの入力を受け取り、そしてないということです。 これは唯一の違いであり、値によって関数の結果に違いはありませんか?

+0

明らかに、このWebサイトに基づいてパフォーマンスに違いがあります。https://relinklabs.com/tensorflow-vs-numpy –

答えて

3

述べたように、パフォーマンスの違いがあります。 TensorFlowには、両方のCPUまたはGPUで動作するように設計されているという利点があります。そのため、CUDA対応GPUを使用している場合、TensorFlowの方がはるかに高速になる可能性があります。さまざまなベンチマークをウェブ上で見つけることができます。また、NumbaやTheanoなどの他のパッケージもあります。

しかし、私はあなたがnumpyのとTensorFlow操作はまったく同じであるかどうかについて話していると思います。答えはです。基本的にはyesです、つまり操作の意味は同じです。しかし、それらは完全に別々のライブラリであり、すべての実装が異なるため、結果に小さな違いがあります。例えば、(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の平方根を正しく得ることさえできませんでした。あなたは(CPUのカーネル NVIDIA、フィールド内の他のプレイヤーによって実装CUDAルーチンへの依存は異なっているため、GPUカーネルに)GPU上でそれを実行した場合、あなたはおそらくまだ異なる結果になるだろう。

私の印象は(私が間違っているかもしれないが)TensorFlowは(その典型的なユースケースを考えると理にかなっている)パフォーマンスの交換で精度のビットを犠牲にするより喜んであるということです。私は、同じハードウェア上で2回実行しているだけで、(おそらくfloat32を使用しているので)集計や平均操作での不特定の順序のために、あまりにも私は推測する)。

+0

はい、私はスピードの点でパフォーマンスの向上を望んでいませんでしたが、値の点で違いがあります。違いはごくわずかですが、ごくわずかです。ありがとう!私は3Dテンソルのソフトマックス活性化の違いを確認するためにあなたのアプローチに従いましたが、ほとんどまたは全く違いはありません。 – Blue

+0

あなたの答えをありがとう! numpyとtensorflowを使って私のモデルに若干の違いがあった理由をデバッグするのに役立ちました。 – anon

3

もちろん、実際の違いがあります。 Numpyは高度に最適化されたベクトル化された計算を使用できる配列で動作し、CPU上ではかなりうまく動作しますが、テンソルフローの数学関数は多くの行列乗算がより重要なGPUに最適化されています。だから問題は何を使いたいかということです。 CPUの場合、私はnumpyで行くのに対して、GPUではTF操作を使用するのが理にかなっています。