我正在使用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)
答案 0 :(得分:0)
在教程中说明的tape
的使用是:
y_pred
块内构建with
的操作。 (我认为磁带需要看一下如何计算才能知道如何区分磁带)示例:
with tf.GradientTape() as tape:
y_pred = model_or_function_whatever(inputs)
gradients = tape.gradient(loss, allWeights)
没有必要精确地建立一个“模型”,但是有必要至少在y_pred
开始参与的情况下在区块内计算averaged_samples
。