Реализация градиентных штрафных потерь с тензорным потоком 2 - PullRequest
1 голос
/ 06 апреля 2020

Доброе утро,

Я пытаюсь реализовать улучшенную WGAN для одномерных данных, как описано в этом документе: https://arxiv.org/pdf/1704.00028.pdf

Это было реализовано как пример в keras-contrib github: https://github.com/keras-team/keras-contrib/blob/master/examples/improved_wgan.py Тем не менее, эта реализация градиентных штрафных потерь больше не работает с tf2. K.gradients () возвращает [нет].

ValueError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:505 train_function  *
        outputs = self.distribute_strategy.run(
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:951 run  **
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2290 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2649 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:467 train_step  **
        y, y_pred, sample_weight, regularization_losses=self.losses)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/compile_utils.py:204 __call__
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:143 __call__
        losses = self.call(y_true, y_pred)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/losses.py:246 call
        return self.fn(y_true, y_pred, **self._fn_kwargs)
    <ipython-input-7-4f0896d0107b>:104 gradient_penalty_loss
        gradients_sqr = K.square(gradients)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/backend.py:2189 square
        return math_ops.square(x)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/gen_math_ops.py:9964 square
        "Square", x=x, name=name)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:488 _apply_op_helper
        (input_name, err))

    ValueError: Tried to convert 'x' to a tensor and failed. Error: None values not supported.

Вот полный пример проблемы: https://colab.research.google.com/drive/11dcMKoiCigTnEn7QvmjqLNrJdmFztByT

Кто-нибудь знает, что изменилось ? Любая идея, как решить эту проблему?

ОБНОВЛЕНИЕ: Это игнорирует ошибку при построении графа вычислений. Затем кажется, что он запускается

def gradient_penalty_loss(y_true, y_pred, averaged_samples):
  gradients = K.gradients(y_pred, averaged_samples)[0]
  try:
    gradients_sqr = K.square(gradients)
  except ValueError:
    print("Gradients returned None")
    return 0
  gradients_sqr_sum = K.sum(gradients_sqr, axis=np.arange(1, len(gradients_sqr.shape)))
  gradient_l2_norm = K.sqrt(gradients_sqr_sum)

  gradient_penalty = K.square(1 - gradient_l2_norm)

  return K.mean(gradient_penalty)

Тем не менее, я получаю невероятно высокие функции потерь, градиент_penalty_loss игнорируется? Loss

1 Ответ

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

Если вы сделаете то, что предложено в ОБНОВЛЕНИИ, tf просто проигнорирует функцию потерь

С Tensorflow 2 это кажется невозможным для этого по-старому. Я наконец-то изменил код, чтобы адаптировать его к такому способу создания моделей. Что я предлагаю?

  1. Создание моделей gen / dis c с помощью keras
  2. Присоединяйтесь к ним, расширяя класс tf.keras.Model, например WGAN: https://github.com/timsainb/tensorflow2-generative-models
...