Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用tensorflow 2实现梯度惩罚损失_Python_Tensorflow_Keras_Tensorflow2.0_Tensorflow2.x - Fatal编程技术网

Python 用tensorflow 2实现梯度惩罚损失

Python 用tensorflow 2实现梯度惩罚损失,python,tensorflow,keras,tensorflow2.0,tensorflow2.x,Python,Tensorflow,Keras,Tensorflow2.0,Tensorflow2.x,早上好 我正在尝试实现本文所述的1D数据的改进WGAN: 它已在keras contrib github中作为示例实施: 尽管如此,梯度惩罚损失的这种实现不再适用于tf2。K.gradients()返回[None] ValueError: in user code: /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:505 train_function *

早上好

我正在尝试实现本文所述的1D数据的改进WGAN:

它已在keras contrib github中作为示例实施: 尽管如此,梯度惩罚损失的这种实现不再适用于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.
尽管如此,我得到了越来越高的损失函数,梯度惩罚损失被忽略了吗?

如果按照更新中的建议执行,tf将忽略丢失功能

对于Tensorflow 2,似乎不可能以旧的方式实现这一点。我最终修改了代码,使其适应这种创建模型的方式。我的建议是什么

  • 使用keras创建gen/disc型号
  • 加入他们,扩展tf.keras.Model类,比如WGAN:

  • 我正在看一些非常相似的东西。现在做出任何承诺都为时过早,但我只是通过禁用急切执行(
    tensorflow.compat.v1.disable\u eager\u execution()
    )成功地消除了所讨论的错误。如果你确实需要急切的执行,那么我认为你需要gradienttape。我现在还不想写这篇文章作为答案,但我想如果它仍然阻碍了你,那么你可能会喜欢一些可能很快就会奏效的东西,而不是以后会奏效的东西。你好,约西亚!谢谢你的回答,问题似乎正朝着这个方向发展。我设法解决了它,捕捉到了错误,它似乎只在构造计算图时产生了错误。(我会把代码贴在帖子里)。然后它似乎运行良好!我不知道的是,如果在构造图时忽略错误,会使tensorflow忽略损失函数
    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)