对于一些自定义代码,我需要运行一个 for 循环来在 Tensorflow 2 中动态创建一个变量(启用急切执行模式)。(在我的自定义代码中,我写入变量的值需要渐变,因此我想跟踪 for 循环中的计算,以便从 autodiff 中获取渐变)。我的代码有效,但速度非常慢。事实上,它比在 numpy 中执行相同的操作要慢几个数量级。
我已经隔离了这个问题,并提供了一个突出问题的玩具代码片段。修复它将允许我修复我的自定义代码。
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)
此代码片段的关键要点是,在 for 循环中,我只需要更新变量的一部分。每次迭代时要更新的切片都不同。用于更新的数据在每次迭代中都不同(在我的自定义代码中,它是依赖于变量切片的一些简单计算的结果,这里我只是使用固定数组来隔离问题。)
我正在使用 Tensorflow 2,并且 TensorFlow 代码理想情况下需要在启用急切执行的情况下运行,因为部分自定义操作依赖于急切执行。
我是 Tensorflow 的新手,我非常感谢解决这个问题的任何帮助。
非常感谢,马克斯