【发布时间】:2020-07-27 02:38:57
【问题描述】:
对于一些自定义代码,我需要运行一个 for 循环来在 Tensorflow 2 中动态创建一个变量(启用急切执行模式)。 (在我的自定义代码中,我写入变量的值需要渐变,因此我想跟踪 for 循环中的计算,以便从 autodiff 中获取渐变)。我的代码有效,但速度非常慢。事实上,它比在 numpy 中执行相同的操作要慢几个数量级。
我已经隔离了问题,并提供了一个玩具代码 sn-p 来突出问题。修复它将允许我修复我的自定义代码。
import numpy as np
import tensorflow as tf
import timeit
N = int(1e5)
data = np.random.randn(N)
def numpy_func(data):
new_data = np.zeros_like(data)
for i in range(len(data)):
new_data[i] = data[i]
return new_data
def tf_func(data):
new_data = tf.Variable(tf.zeros_like(data))
for i in range(len(data)):
new_data[i].assign(data[i])
return new_data
%timeit numpy_func(data)
%timeit tf_func(data)
这段代码 sn-p 的主要内容是在 for 循环中我只需要更新变量的一部分。每次迭代时要更新的切片都不同。用于更新的数据在每次迭代时都不同(在我的自定义代码中,它是依赖于变量切片的一些简单计算的结果,这里我只是使用固定数组来隔离问题。)
我正在使用 Tensorflow 2,并且 TensorFlow 代码理想情况下需要在启用 Eager Execution 的情况下运行,因为部分自定义操作依赖于 Eager Execution。
我是 Tensorflow 的新手,如果能帮助我解决这个问题,我将不胜感激。
非常感谢, 最大
【问题讨论】:
标签: tensorflow for-loop variable-assignment tensorflow2.0 eager-execution