部分地评估张量

时间:2017-09-12 12:07:09

标签: tensorflow

假设我们有一个卷积操作,例如:

range(1,n_files+1)

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

Content Hugging Priority

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

  1. TF运行整个操作,即它完全计算Content Compression Resistance Priority,然后返回y = tf.nn.conv2d( ... )
  2. 的值
  3. TF只运行必要的操作来计算print(sess.run(y[0]))

1 个答案:

答案 0 :(得分: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
相关问题