【发布时间】:2017-09-12 12:07:08
【问题描述】:
假设我们有这样一个卷积操作:
y = tf.nn.conv2d( ... )
Tensorflow 允许您评估张量的一部分,例如:
print(sess.run(y[0]))
当我们像上面那样部分评估张量时,以下哪一项是正确的?
- TF 运行整个操作,即它完全计算
y,然后返回y[0]的值 - TF 只运行计算
y[0]所需的操作。
【问题讨论】:
标签: tensorflow
假设我们有这样一个卷积操作:
y = tf.nn.conv2d( ... )
Tensorflow 允许您评估张量的一部分,例如:
print(sess.run(y[0]))
当我们像上面那样部分评估张量时,以下哪一项是正确的?
y,然后返回y[0] 的值
y[0] 所需的操作。 【问题讨论】:
标签: tensorflow
我设置了一个小示例程序:
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
【讨论】: