GradientTape()。gradient()在观察到腱的情况下返回None-Tensorflow 2

时间:2019-12-27 14:30:46

标签: python tensorflow machine-learning keras tensorflow2.0

我正在使用Tensorflow 2,并试图使用两个张量来计算梯度。

y_pred的形状为(None, 1)averaged_samples是长度为2的列表,其中每个元素的形状均为(None, 16834, 1)。但是,渐变总是返回[None, None]。需要注意的一件事是tf.gradients在禁用急切执行(而不是渐变磁带)的情况下可以正常工作。

我的代码是:


# Image input (real sample)
        real_audio = Input(shape=(self.a*16384, 1))

        # Noise input
        z_disc = Input(shape=(self.a, self.latent_dim))
        # Generate image based of noise (fake sample)
        fake_audio = self.generator(z_disc)

        # Discriminator determines validity of the real and fake images
        fake = self.critic(fake_audio)
        valid = self.critic(real_audio)

        # Construct weighted average between real and fake images
        interpolated_audio = RandomWeightedAverage()([real_audio, fake_audio])
        # Determine validity of weighted sample
        validity_interpolated = self.critic(interpolated_audio)

        # Use Python partial to provide loss function with additional
        # 'averaged_samples' argument
        partial_gp_loss = partial(self.gradient_penalty_loss,
                          averaged_samples=interpolated_audio)
        partial_gp_loss.__name__ = 'gradient_penalty' # Keras requires function names

        self.critic_model = Model(inputs=[real_audio, z_disc],
                            outputs=[valid, fake, validity_interpolated])
        self.critic_model.compile(loss=[self.wasserstein_loss,
                                              self.wasserstein_loss,
                                              partial_gp_loss],
                                        optimizer=optimizer,
                                        loss_weights=[1, 1, 10])

def gradient_penalty_loss(y_true, y_pred, _averaged_samples):
    with tf.GradientTape() as tape:
        tape.watch(y_pred)
        tape.watch(averaged_samples[0])
        tape.watch(averaged_samples[1])
        gradient = tape.gradient(y_pred, averaged_samples)

1 个答案:

答案 0 :(得分:0)

在教程中说明的tape的使用是:

  • 让所有在y_pred块内构建with的操作。 (我认为磁带需要看一下如何计算才能知道如何区分磁带)
  • 获取with块之外的渐变。

示例:

with tf.GradientTape() as tape:
    y_pred = model_or_function_whatever(inputs)

gradients = tape.gradient(loss, allWeights)

没有必要精确地建立一个“模型”,但是有必要至少在y_pred开始参与的情况下在区块内计算averaged_samples