TensorFlow与Theano表演

时间:2017-07-27 21:29:00

标签: python performance tensorflow theano

在一些神经网络研究的背景下,我正在评估如何实现这些或使用什么库的几种方法。目前我正在比较Tensorflow和Theano,我正在努力获得 TenorFlow表现不错。这是我的简单Hello-Gradient-Benchmark,它只是用一个系数优化标量乘法。

import time

class Timer:

   def __init__(self, what):
      self.what = what

   def __enter__(self):
      self.t1 = time.time()
      return self

   def __exit__(self,t,v,tb):
      t2 = time.time()
      print("{0} runs {1:.4f} seconds".format(self.what, t2-self.t1))


def run_tensorflow():

   import tensorflow as tf

   x = tf.placeholder(tf.float32)
   y = tf.placeholder(tf.float32)
   a = tf.Variable([1.], tf.float32)

   sess = tf.Session()
   sess.run(tf.global_variables_initializer())

   loss = (y-a*x)**2
   step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

   def one_step():
      sess.run(step, {x:1.,y:0.})

   with Timer('tensorflow') as t:
      result = [ one_step() for n in range(1000) ]


def run_theano():

   import theano as th

   x = th.tensor.dscalar()
   y = th.tensor.dscalar()
   a = th.tensor.dscalar()
   l = a*x

   loss = (y-l)**2
   dloss = th.tensor.grad(loss, a)
   dloss_f = th.function([x,y,a], dloss)

   a = [1.]

   def one_step():
      a[0] -= 0.01 * dloss_f(1.,0.,a[0])

   with Timer('theano') as t:
      result = [ one_step() for n in range(1000) ]


run_tensorflow()
run_theano()

我在CPU上运行此程序,并通过pip安装了软件包。 TensorFlow和Theano的运行时间分别为0.36和0.043秒。我看到实际网络的性能差异相似,矩阵乘法开销应占主导地位,但TensorFlow仍然明显变慢。

我想知道我是否正在错误地使用Tensorflow进行我正在尝试的操作。我不应该在循环中调用run()方法吗?

1 个答案:

答案 0 :(得分:4)

  1. TF和Theano设计用于处理大型对象,大约1M个元素。对标量的处理进行基准测试并不是特别重要。

  2. 这是一个苹果与橘子的比较:使用TF,您可以同时计算编译和运行时间,而在Theano中,您只需计算运行时间!这是因为当你调用theano.function时,它会完成所有编译。 TF中的OTOH,当你第一次调用sess.run时,大部分工作都会转移到。

  3. 也就是说,当TF比Theano慢时,也有现实的情况。