Почему Tensorflow не может вычислить градиент по измененным параметрам? - PullRequest
0 голосов
/ 06 сентября 2018

Я бы хотел вычислить градиент потерь по всем параметрам сети. Проблема возникает, когда я пытаюсь изменить каждую весовую матрицу, чтобы она была одномерной (это полезно для вычислений, которые я делаю позже с градиентами).

В этот момент Tensorflow выводит список None (что означает, что не существует пути от потерь к этим тензорам, в то время как должны быть изменены параметры модели).

Вот код:

all_tensors = list()
for dir in ["fw", "bw"]:
    for mtype in ["kernel"]:
        t = tf.get_default_graph().get_tensor_by_name("encoder/bidirectional_rnn/%s/lstm_cell/%s:0" % (dir, mtype))
        all_tensors.append(t)
        # classifier tensors:
    for mtype in ["kernel", "bias"]:
        t = tf.get_default_graph().get_tensor_by_name("encoder/dense/%s:0" % (mtype))
        all_tensors.append(t)
all_tensors = [tf.reshape(x, [-1]) for x in all_tensors]
tf.gradients(self.loss, all_tensors)

all_tensor в конце цикла for находится список из 4 компонентов с матрицами различной формы. Этот код выводит [None, None, None, None]. Если я уберу измененную линию all_tensors = [tf.reshape(x, [-1]) for x in all_tensors] код работает нормально и возвращает 4 тензора, содержащего градиенты по каждому параметру.

Почему это происходит? Я почти уверен, что изменение формы не нарушает никакой зависимости в графике, в противном случае его вообще нельзя использовать ни в одной сети.

1 Ответ

0 голосов
/ 06 сентября 2018

Ну, дело в том, что нет пути от ваших тензоров к потере. Если вы думаете о графе вычислений в TensorFlow, self.loss определяется через серию операций, которые в какой-то момент используют интересующие вас тензоры. Однако, когда вы делаете:

all_tensors = [tf.reshape(x, [-1]) for x in all_tensors]

Вы создаете новые узлы на графике и новые тензоры, которые никем не используются. Да, между этими тензорами и величиной потерь существует связь, но с точки зрения TensorFlow это изменение формы является независимым вычислением.

Если вы хотите сделать что-то подобное, вам придется сначала изменить форму, а затем вычислить потери, используя измененные тензоры. Или, в качестве альтернативы, вы можете просто вычислить градиенты относительно исходных тензоров и затем изменить форму результата.

...