Tensorflow:使用Scan构建的图表比使用For-Loop构建的图表慢

时间:2018-03-12 19:30:38

标签: tensorflow profiling

我在tensorflow中实现了一个迭代算法,我很惊讶地发现,作为for循环生成的图形比运行扫描生成的图形更快 。在我的代码中,我有两个可能的函数实现:

使用For循环:

def multi_step(self, x_data, acts, epsilon, n_iter, beta=None, y_data=None):
    for i in range(n_iter):
        acts = self.step(x_data=x_data, acts=acts, epsilon=epsilon, beta=beta, y_data=y_data)
    return acts

或使用扫描:

def multi_step(self, x_data, acts, epsilon, n_iter, beta=None, y_data=None):
    output = tf.scan(
        fn = lambda last_acts, _: self.step(x_data=x_data, acts=last_acts, epsilon=epsilon, beta=beta, y_data=y_data),
        initializer=acts,
        elems = tf.range(n_iter),
    )
    return[o[-1] for o in output]

我已经证实这些结果相同。

正如预期的那样,使用for循环编译图形需要更长的时间(并且这个时间与迭代次数一致)。

但令人意外的是,for循环图表的运行速度提高了2倍:

Comparing the 20-step versions of loop and scan:
            Graph Building (s)      Initializing Params (s)       Rate (iter/s)
Scan        4.206                   1.6                            34-38
Loop        21.85                   7.5                            84-91

拥有两全其美(快速编译,快速运行时)会很好,而且似乎没有充分理由说明它不可能实现。

有没有人遇到过这个问题?我有一个容易解决的问题吗?

0 个答案:

没有答案