我想在模型训练后获取其 dradient。例如,我有输入张量 X 和输出 y,即 y = model(x)。因此,使用 pytorch,我可以使用以下命令计算 dradient:
y = model(x)
dydx = torch.autograd.grad(Y, X, torch.ones_like(Y), create_graph=True)[0][:, 0]
我希望用TensorFlow框架训练模型后得到相同的值。
我试过:
y = model.predict_u(x)
dydx = tf.gradients(y, x)[0]
但是我得到的 dydx 为 NoneType。我尝试将 dydx 包含在模型类中并通过 tf.Session 获取梯度,但出现了:“ResourceExhaustedError:图形执行错误”。
我曾使用过 Pytorch 框架,现在我决定尝试 TensorFlow,但遇到了一些困难。
要在 TensorFlow 中以类似于在 PyTorch 中的方式计算梯度,您需要使用 TensorFlow 的自动微分功能。但是,需要记住几个关键区别:
以下是在 TensorFlow 2.x 中计算梯度的方法,类似于 PyTorch 示例:
有关该主题的更多信息: https://www.tensorflow.org/guide/autodiff https://www.tensorflow.org/api_docs/python/tf/GradientTape
UPD:也可能存在问题
x
dydx 为 None:这种情况通常是因为 TensorFlow 不知道它需要计算相对于 x 的梯度。默认情况下,只监视 tf.Variable 对象。通过使用 tape.watch(x),您可以明确告诉 TensorFlow 跟踪 x。