【问题标题】:Implementing gradient penalty loss with tensorflow 2使用 tensorflow 2 实现梯度惩罚损失
【发布时间】:2020-07-18 08:26:55
【问题描述】:

早上好,

我正在尝试为一维数据实现改进的 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() 返回 [None]。

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)

尽管如此,我得到越来越高的损失函数,gradient_penalty_loss 被忽略了吗?

【问题讨论】:

  • 我在看一些非常相似的东西。现在承诺任何事情都为时过早,但我只是通过禁用急切执行(tensorflow.compat.v1.disable_eager_execution())设法摆脱了有问题的错误。如果您确实确实需要急切的执行,那么我认为您需要渐变胶带。我暂时不会写这个作为答案,但我想如果它仍然阻止你,那么你可能会喜欢一些可能很快就会起作用的东西,而不是稍后会起作用的东西。
  • 你好乔赛亚!谢谢您的回答,问题似乎朝那个方向发展。我设法解决它捕获错误,它似乎只在构建计算图时产生错误。 (我将在帖子中发布代码)。然后它似乎运行良好!我不知道的是,如果在构建图形时忽略错误会使 tensorflow 忽略损失函数

标签: python tensorflow keras tensorflow2.0 tensorflow2.x


【解决方案1】:

如果您按照 UPDATE 中的建议进行操作,tf 将忽略损失函数

使用 Tensorflow 2,以这种旧方式似乎是不可能的。我最终更改了代码以使其适应这种创建模型的方式。我建议什么?

  1. 使用 keras 创建 gen/disc 模型
  2. 加入他们扩展 tf.keras.Model 类,例如:https://github.com/timsainb/tensorflow2-generative-models 的 WGAN

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 2022-06-11
    • 2021-01-14
    • 2020-09-01
    • 2021-11-17
    • 2018-04-13
    • 2018-06-28
    • 2012-05-12
    • 2021-04-01
    相关资源
    最近更新 更多