Ожидаемый float32, получил - PullRequest
       0

Ожидаемый float32, получил

0 голосов
/ 12 апреля 2020

Я пытаюсь создать функцию для оптимизации потерь, я использую оптимизатор Adam с уровнем обучения, который я прохожу в самом классе. Тем не менее, мне посоветовали применить отсечение, чтобы устранить взрывной градиент с помощью функции clip_by_norm.

def perform_optimization(self):
    """Specifies the optimizer and train_op for the model."""

    # Create an optimizer (tf.train.AdamOptimizer)
    self.optimizer =  tf.train.AdamOptimizer(learning_rate= self.learning_rate_ph)
    self.grads_and_vars = self.optimizer.compute_gradients(self.loss)

    clip_norm = tf.cast(1.0, tf.float32)
    self.grads_and_vars = tf.clip_by_norm(t=self.grads_and_vars,clip_norm=clip_norm) 

    self.train_op = self.optimizer.apply_gradients(self.grads_and_vars)

Я получил ошибку, показанную в заголовке, и проследил все свои функции в классе, и ошибка произошла из-за этого line

self.grads_and_vars = tf.clip_by_norm(t=self.grads_and_vars,clip_norm=clip_norm)

Я не совсем уверен, что я сделал неправильно, так как я впервые использую clip_by_norm. есть идеи?

1 Ответ

0 голосов
/ 12 апреля 2020

обнаружил, что ошибка в том, что переменная self.grads_and_vars содержит как градиенты, так и переменные, поэтому я должен составить список, чтобы получить только градиенты следующим образом

 self.grads_and_vars =[(tf.clip_by_value(grad, -1., 1.), var) for grad, var in self.grads_and_vars]

, и это сработало!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...