Keras中是否有类似于Pytorch中的zero_grad()的函数?

Zij*_*Xue 7 keras tf.keras

在Pytorch中,我们可以调用zero_grad()清除渐变。在Keras中,我们是否有类似的功能,以便我们可以实现相同的目标?例如,我想累积一些批次之间的梯度。

Gio*_*lli 2

在 Pytorch 中,每个变量的梯度都会累积,并且损失值会分布在所有变量之间。然后优化器负责更新模型参数(在初始化时指定),并且由于更新值始终保存在内存中,因此必须在开始时将更新值归零。

optimizer = torch.optim.Adam(itertools.chain(*param_list), lr=opt.lr, ...)
...
optimizer.zero_grad()
loss = ...
loss.backward()
optimizer.step()
Run Code Online (Sandbox Code Playgroud)

在带有梯度磁带的 keras 中,您正在包装一堆要计算梯度的变量的操作。您调用gradient磁带上的方法来计算更新,传递损失值和必须计算梯度更新的变量。优化器仅将单个更新应用于单个参数(对于您指定的更新参数的整个列表)。

with tf.GradientTape() as tape:
    loss = ...
grads = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
Run Code Online (Sandbox Code Playgroud)

您可以使用 .fit() 方法来代替,它在幕后完成了所有这些工作。

如果您的目标是累积多次更新,在 Keras 中没有标准方法,但您可以使用磁带更轻松地做到这一点,在应用更新值之前累积更新值(请参阅此https://www.tensorflow.org/api_docs/ python/tf/GradientTape#:~:text=To%20compute%20multiple%20gradients%20over%20the%20same%20计算)。

这里解释了一个很好的解决方案.fit()如何在 Keras 中累积大批量的梯度

如果您想更多地了解如何有效跟踪参数梯度以分配损失值并更好地理解整个过程,请查看(维基百科)自动微分