【问题标题】:TensorFlow Keras: print out and save loss and gradients during model.fitTensorFlow Keras:在 model.fit 期间打印并保存损失和梯度
【发布时间】:2021-08-17 19:13:57
【问题描述】:

我正在使用这样的基本代码在 TensorFlow Keras 中训练神经网络:

model.fit(x_train, y_train, epochs=5)

对于model.fit的每个时期,有没有办法打印并保存损失函数值、梯度和梯度范数?

谢谢。

【问题讨论】:

  • 您可以使用callbacks 打印甚至保存您需要的任何内容。例如在 CSV 文件中(结帐CSVLogger callback)。要保存模型变量,您还可以使用 callbackscheckpoints
  • 谢谢!以及如何在训练期间计算梯度?
  • 如果您使用自定义训练,tf.GradientTape() 将为您完成,然后您可以使用tape.gradient() 函数计算梯度。
  • 或者如果你想使用model.fit(),所有变量都存储在tf.Variable中。你可以像这样打印它们print(model.trainable_variables)
  • 谢谢!你的意思是如果我使用model.fit(),我只能得到变量,但不能得到梯度?我也可以使用 model.fit() 获得渐变吗?还是我必须进行自定义培训?

标签: python tensorflow keras gradient loss


【解决方案1】:

为了在训练期间每个 epoch 后打印和保存变量,您可以使用Callbacks。您可以编写自己的回调或使用内置回调。 例如内置回调,CSVLogger 帮助您将每个 epoch 结果存储在 CSV 文件中。

您也可以使用ModelCheckpoint 来在检查点的每个时期之后保存权重。

如果你想在每个 epoch 之后打印渐变,你有两种可能。

要么编写自定义训练并使用tf.GradientTape() 记录自动微分操作,然后使用tape.gradient() 函数为您计算梯度。请参阅此link 了解更多信息。

或者如果你想使用model.fit(),你应该再次编写一个自定义回调,然后在模型中打印变量,如下所示:print(model.trainable_variables)

这里是一个自定义回调的例子:

class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
   print(model.trainable_variables)

my_callback = myCallback()
model.fit(x_train, y_train, epochs=5, callbacks=[my_callback])

【讨论】:

  • 谢谢!这很清楚!我唯一的问题是,在您给出的示例自定义回调中,我应该用其他函数替换 print(model.trainable_variables) 以获得渐变,对吧?似乎 print(model.trainable_variables) 只打印变量,而不是梯度。
  • 渐变到底是什么意思? trainable_variables 实际上是更新的权重和偏差,并且在每个 epoch 之后您都可以打印它们。梯度在每次迭代(不是每个时期)后计算,并从权重和偏差中减去。
  • 是的,我的意思是每次迭代后计算的梯度。即如果每次迭代的更新是:trainable_variables = trainable_variables - step_size * gradients,我想得到这些梯度的值。
  • 据我所知,在这种情况下,您最好实施自定义培训。但是有一个技巧可以帮助您获得渐变。如果你在每次迭代中减去权重和偏差,你就会得到梯度。将此添加到您的回调中并计算每次迭代中变量的差异。对于每次迭代中的计算,您可以在回调中使用on_batch_end 函数。
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多