Для некоторого пользовательского кода мне нужно запустить for-l oop, чтобы динамически создать переменную в Tensorflow 2 (с активным режимом исполнения). (В моем собственном коде для значений, которые я пишу в переменную, потребуются градиенты, поэтому я хочу отслеживать вычисления в for l oop, чтобы я мог получать градиенты из 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-l oop Мне нужно только обновить фрагмент переменной. Срез, который нужно обновить, отличается на каждой итерации. Данные, используемые для обновления, отличаются на каждой итерации (в моем пользовательском коде это результат нескольких простых вычислений, которые зависят от кусочков переменной, здесь я просто использую фиксированный массив для изоляции проблемы.)
Я использую Tensorflow 2, и в идеале код тензорного потока должен запускаться с активным выполнением, так как части пользовательских операций зависят от исполнения.
Я новичок в Tensorflow и буду очень признателен за помощь в решении этой проблемы.
Большое спасибо, Макс