【问题标题】:Tensorflow vs Numpy math functionsTensorflow 与 Numpy 数学函数
【发布时间】:2017-07-31 08:18:23
【问题描述】:

numpy 和 tensorflow 执行的数学函数之间有什么真正的区别吗?例如,指数函数,还是最大函数?

我注意到的唯一区别是 tensorflow 接受张量的输入,而不是 numpy 数组。 这是唯一的区别,函数的结果没有区别吗?

【问题讨论】:

    标签: python numpy tensorflow


    【解决方案1】:

    如前所述,存在性能差异。 TensorFlow 的优势在于它被设计为可在 CPU 或 GPU 上运行,因此,如果您拥有支持 CUDA 的 GPU,TensorFlow 的速度可能会快得多。您可以在 Web 上找到多个具有不同比较的基准,也可以与 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,所以这是一个因素我猜也是)。

    【讨论】:

    • 是的,我不是在寻找速度方面的性能提升,而是价值方面的差异。我会说,差别很小,可以忽略不计。谢谢!我按照你的方法检查了 3D 张量的 softmax 激活的差异,几乎没有差异。
    • 感谢您的回答!!它帮助我调试了为什么我的模型使用 numpy 和 tensorflow 有细微的差别。
    【解决方案2】:

    当然有真正的区别。 Numpy 在可以使用高度优化的矢量化计算的数组上工作,并且在 CPU 上做得很好,而 tensorflow 的数学函数针对 GPU 进行了优化,其中许多矩阵乘法更为重要。所以问题是你想在哪里使用什么。对于 CPU,我只会使用 numpy,而对于 GPU,使用 TF 操作是有意义的。

    【讨论】:

    • 我强烈反对! TensorFlow 创建了一个可以在 CPU 或 GPU 上执行的向量化图,这意味着它会在底层调用相应的内核。 CPU 内核也在底层使用 MKL 或 BLAS 进行了高度优化。
    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2018-10-19
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多