在编写自定义损失函数时何时使用 tf.GradientTape

when to use tf.GradientTape during writing a custom loss function

我正在阅读 tensorflow 中有关自定义损失函数的一些内容,并且正在阅读教程页面中提供的示例(请参阅下面的 link)。

https://www.tensorflow.org/tutorials/customization/custom_training_walkthrough

这是link中提供的一个简单损失。

loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

def loss(model, x, y, training):
  y_ = model(x, training=training)
  return loss_object(y_true=y, y_pred=y_)

在这个例子之后,作者提到 Use the tf.GradientTape context to calculate the gradients used to optimize your model.

我的问题是为什么需要使用 tf.GradientTapetensorflow 在使用任何优化器(例如 Adam 时实际上不会计算梯度吗?

其实我也看了之前贴在这里的一个问题

您可以看到 none 个答案使用 tf.GradientTape。我正在分享发布的答案之一,这对我来说很有意义。

def focal_loss(y_true, y_pred):
  pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
  pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))
  custom_loss=kb.square((pt_1-pt_0)/10)
  return custom_loss    

model.compile(loss=focal_loss,
          optimizer='adam',
          metrics=['accuracy'])

相反,在另一个类似的问题中,所有答案都使用tf.GradientTape

此刻,我有点困惑。有人可以解释一下 tf.GradientTape 有什么用,我什么时候应该考虑使用它?

这完全取决于您训练模型的方式。如果您使用 model.fit 来训练您的模型,那么您不必显式使用 tf.GradientTape,但它仍在后台使用!如果您像您引用的演练中那样定义自定义训练循环,则必须使用 tf.GradientTape

enables you to retrieve the gradients of the trainable weights of the layer with respect to a loss value. Source

现在关于你的问题:计算出的梯度形式上是偏导数或变化的度量,你的模型的优化器会根据这些梯度调整模型的各个权重。