Tensorflow: правильный способ инициализировать конкатенированные тензоры? - PullRequest
0 голосов
/ 20 июня 2020

Вот MWE для проблемы, с которой я столкнулся:

import tensorflow as tf

with tf.GradientTape() as tape:
  x = tf.Variable(0.0)
  y = tf.Variable(x)
  z = x

print(tape.gradient(y, x))
# None

print(tape.gradient(z, x))
# 1.0

Ну, очевидно, что это легко исправить в данной конкретной ситуации, но в фактическом случае использования, с которым я сталкиваюсь, необходимо делать с рекуррентными нейронными сетями, мне нужно использовать tf.Variable для формирования тензоров из конкатенации других тензоров, например:

Dout = tf.Variable([seed]) # initialize 
for i in range(n):
  Dout = tf.concat([Dout, 
                    G.forward_step(Dout[-1])], 
                   axis = 0)

Ну, я новичок в реальном манипулировании тензорами в TF, и, возможно, есть правильный способ создания тензоров из конкатенации.

Помощь?

1 Ответ

0 голосов
/ 22 июня 2020

Хорошо, понятно - вы должны инициализировать как список (а не тензор вообще), а затем использовать tf.stack, чтобы преобразовать его в тензор.

В любом случае tf.Variable - это здесь неправильно использовать - нам не нужна обучаемая переменная, мы хотим tf.constant.

...