我在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
拥有两全其美(快速编译,快速运行时)会很好,而且似乎没有充分理由说明它不可能实现。
有没有人遇到过这个问题?我有一个容易解决的问题吗?