【问题标题】:Evaluating a tensor partially部分评估张量
【发布时间】:2017-09-12 12:07:08
【问题描述】:

假设我们有这样一个卷积操作:

y = tf.nn.conv2d( ... )

Tensorflow 允许您评估张量的一部分,例如:

print(sess.run(y[0]))

当我们像上面那样部分评估张量时,以下哪一项是正确的?

  1. TF 运行整个操作,即它完全计算y,然后返回y[0] 的值
  2. TF 只运行计算y[0] 所需的操作。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    我设置了一个小示例程序:

    import os
    os.environ['CUDA_VISIBLE_DEVICES'] = '-1' # forcing to run on the CPU
    import tensorflow as tf
    
    def full_array(sess, arr):
      sess.run(arr)[0]
      
    def partial_array(sess, arr):
      sess.run(arr[0])
      
    sess = tf.Session()
    arr = tf.random_uniform([100])
    arr = arr + tf.random_uniform([100])
    

    这些是我的结果:

    %timeit partial_array(sess, arr)
    100 loops, best of 3: 15.8 ms per loop
    
    %timeit full_array(sess, arr)
    10000 loops, best of 3: 85.9 µs per loop
    

    从时间上看,部分运行实际上比完整运行慢得多(老实说这让我感到困惑......)

    对于这些时间安排,我会排除备选方案 1),因为如果这是真的,我希望这两个函数的时间安排大致相同。

    鉴于我的简化测试代码,我倾向于这样一种想法,即确定需要运行图表的哪一部分以满足张量切片的逻辑是导致性能差异的原因,但我目前没有一个证明。

    更新:

    我还用卷积运算而不是加法进行了类似的测试(我认为这可能是一个过于简单的例子):

    def full_array(sess, arr):
      return sess.run(arr)[0]
      
    def partial_array(sess, arr):
      return sess.run(arr[0])
      
    sess = tf.Session()
    arr = tf.random_uniform([1,100,100,3])
    conv = tf.nn.conv2d(arr, tf.constant(1/9, shape=[3,3,3,6]), [1,1,1,1], 'SAME')
    

    但是,结果与之前的一致:

    %timeit full_array(sess, conv)
    1000 loops, best of 3: 949 µs per loop
    
    %timeit partial_array(sess, conv)
    100 loops, best of 3: 20 ms per loop
    

    【讨论】:

    • 在这里生成一个随机数向量可能不是一个有用的例子。在卷积中,上层的某个“像素”只依赖于输入的某个部分。我想也许这种部分评估的逻辑已经在 TF 中实现了。
    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2014-07-23
    • 2018-06-04
    • 2021-04-10
    相关资源
    最近更新 更多