问题标签 [gradienttape]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
386 浏览

python - model.fit 与在 model.trainable 变量上使用显式 GradientTape 有何不同?

因此,我一直在尝试使用 Keras 的 Model.fit() 和低级 TF GradientTape 来优化神经网络的可训练参数,并注意到 Keras 版本明显更好。

最终 MSE 为的 Keras 优化版本的代码:

这给出了图表:Keras 拟合与实际值的偏差

但是,当我使用 tf.GradientTape 优化 Keras 模型时,如下代码所示:

并获得下图的偏差值。GradeintTape fit 的偏差值

您会注意到,Keras 拟合版本中的值比使用 GradientTape 获得的值更接近实际值。此外,Gradient Tape 值最终对于不同的输入也没有太大变化,并且在平均值附近工作,而 Keras 则表现出更多的多样性。

那么如何使用 GradientTape 低级 API 来获得与 Keras 高级 API 相当的性能呢?Model.fit 所做的比我的实现要好得多的原因是什么?我尝试浏览源代码,但基本上无法确定它。

提前致谢。

0 投票
1 回答
319 浏览

tensorflow - 在 2020 年 TF 峰会上实施“使用 Tensorflow 学习阅读”演讲 - Tensorflow 2.1/2.2 中的 EncoderDecoder Seq2Seq 模型 - 自定义训练步骤


背景资料


我正在为我在 Tensorflow 2020 峰会上发现的每一个有趣的演讲创建Google Colabs 。作为说明,我使用的是 Tensorflow 2.1。


我在尝试实施'Learning To Read With Tensorflow'谈话时遇到了问题。


在我们得到EncoderDecoder类定义之前,一切都很顺利。当我在我的自定义子类上实现 fit 方法时,Model我收到一个错误,将在下面详细说明。

最后一个显着错误是AttributeError: 'NoneType' object has no attribute 'dtype'

但是,我认为这是由于GradientTape范围代码内的问题和/或Decoder Layers(包括Attention Layers)定义的问题



主要代码



详细的错误信息



如果希望复制,如何获取data和变量lines

获取数据

预处理数据

参考

提前致谢!!

0 投票
1 回答
131 浏览

python - Tensorflow GradientTape 不跟踪 optimizer.apply_gradients?

我正在学习 tensorflow2.0 GradientTape() 并测试此代码,它计算二阶导数 d(x-0.01*df(x)/dx)/dx。给定 x = 3 和 f(x) = x*x,结果为 5.7624。上面的代码得到了正确的答案。然后我尝试更换线路

经过

并得到了错误的答案 5.88,我无法解决这个问题并猜测 GradientTape 不跟踪 apply_gradients?有人知道为什么吗?

python-3.7,张量流-2.0.0

0 投票
1 回答
295 浏览

tensorflow - 关于使用 tf.GradientTape 的图像的 logits 雅可比矩阵

我试图找到关于输入的 logits 的雅可比行列式,但我确实得到了None,但我不知道为什么。

假设我有一个模型,我训练它并保存它。

在此处输入图像描述

如果您不想训练它,您可以在此链接h5中找到格式保存的模型。

到目前为止效果很好,我可以对一些样本进行预测:

我现在要做的是找到关于输入图像的 logits 的雅可比矩阵。由于我有 10 个选定的图像,我将有一个雅可比矩阵,(10, 28, 28, 1)因为 MNIST 样本的形状是(28, 28, 1). 我可以使用 Tensorflow 1.0 来做到这一点,例如:

X_p我输入的图像的占位符在哪里。

但是,我目前使用的是 Tensorflow 2.0,我无法使用tf.GradientTape. 它总是结束None。这似乎是每个人的常见问题,我按照这里的示例进行操作,但无济于事。有人可以帮我吗?

0 投票
0 回答
138 浏览

machine-learning - 为什么在尝试查找输入的损失梯度时,Tensorflow 的 Gradient Tape 会返回 None?

我有一个在 keras 中构建的 CNN 模型,它在最后一层使用了 SVM。我通过将输入输入到 CNN 模型中,提取相关特征,然后将这些特征放入我的 SVM 以获得输出预测,从而得到这个 SVM 的预测。这整个过程我在下面的代码中命名为 predict_DNR_tensor。这工作正常,我能够得到正确的预测。我现在正试图从我的 SVM wrt 到原始输入中获​​得这个预测的平方铰链损失的梯度,请参阅代码。但是,当在这里使用渐变胶带时,它似乎不起作用,该函数只返回无。当我将它与仅 CNN 模型(没有 SVM)的输出预测一起使用时,它很好并且给了我一个梯度。为什么?

使用的变量如下:

当我使用损失计算梯度时,我返回无。当我使用 loss2 计算梯度时,我得到了预期的值数组。loss 和 loss2 之间的唯一区别是 y_pred 和 y_pred2。y_pred2 据我了解,它只是 keras 中构建的 cnn 模型的输出预测。(注意:我的损失对于这个函数并不正确,我只是想看看如果我使用这个模型的输出它是否会抛出一个梯度。)

y_pred 然而,我实际上感兴趣的是调用用作 cnn 模型最后一层的 SVM 的输出。IE。它为此输入图像获取 cnn 模型的特征,然后将这些特征放入单独的 svm 模型中以获得这些输出。

y_pred 和 y_pred2 在它们的数据类型和形状上看起来很相似,不管有不同的值。为什么 y_pred 然后无法得到渐变?有没有办法解决它?

0 投票
1 回答
755 浏览

python - 在 TensorFlow2 中使用 GradientTape() 计算偏导数的问题

我在使用 TensorFlow 中的自动微分计算梯度时遇到问题。基本上我想创建一个只有一个输出值 f 并获得两个值 (x,t) 的输入的神经网络。网络应该像一个数学函数一样工作,所以在这种情况下 f(x,t) 其中 x 和 t 是输入变量,我想计算偏导数,例如df_dx, d2f/dx2or df_dt。我稍后需要这些偏导数来获得特定的损失函数。这是我的简化代码:

我期望的是我得到df_dx = [0.284864038](grad_f 的第一个组件),但它导致None. 我的问题是:

  1. 是否可以将 f 的偏导数仅计算为一个输入变量?
  2. 如果是:我必须在我的代码中更改计算 df_dx 不会产生的内容None

我认为可以做的是修改class MyModel我使用两个不同 Inputlayer(一个用于 x,一个用于 t)的架构,以便我可以调用模型,f = model(x,t)但这对我来说似乎不自然,我认为应该有一个更简单的方法.


另一点是,例如,当我将 Flattenlayer 的 input_shape 更改为self.flatten = Flatten(input_shape=(5,1)但我的 inputvector 具有 shape(1,2,1) 时,我没有得到错误,所以我希望得到一个错误,但事实并非如此,为什么?我很感谢你的帮助:)


我使用以下配置:

  • 使用 Python 扩展作为 IDE 的 Visual Studio Code
  • Python 版本:3.7.6
  • TensorFlow 版本:2.1.0
  • Keras 版本:2.2.4-tf
0 投票
0 回答
96 浏览

tensorflow - 使用 GradientTape 在 Tensorflow 中进行梯度计算 - 获得意外的无值

我在计算 TensorFlow 1.15 中的梯度时遇到问题。我认为这是与上下文管理器或 keras 会话相关的东西,但我不确定。以下是我编写的代码:

为了解决这个问题,我尝试将注释行包装为:

但我仍然将 f_grad 的值设为 None。

0 投票
2 回答
1125 浏览

python - 带有 Keras 的 GradientTape 返回 0

我尝试使用GradientTapeKeras 模型(简化),如下所示:

但是对于 的一些随机值inp,梯度处处为零,而对于其余的,梯度幅度非常小(<1e-7)。

我也用 MNIST 训练的 3 层 MLP 进行了尝试,结果是一样的,但是用没有激活的 1 层线性模型进行尝试。

这里发生了什么?

0 投票
0 回答
779 浏览

tensorflow - 与 tf.gradients() 相比,用于计算雅可比的 tf.GradientTape 性能糟糕透顶

下面的解决方案:

设想:

我试图在一个循环中多次计算用户定义函数的雅可比。我可以使用 TF 2 的 GradientTape 以及旧的基于会话的 tf.gradients() 方法来做到这一点。问题是 GradientTape 比 tf.gradients() 慢得多(慢 100 倍)。它具有我想使用的功能(bath_jacobian、hessian 支持等),但如果它慢 100 倍,那么我就无法使用它。

问题:

我不清楚我是否只是在滥用 GradientTape,或者它是否总是会变慢,因为它每次调用时都必须重新区分提供的函数(我的怀疑)。我正在寻求解决我使用 GradientTape 的提示,或者确认它从根本上总是比 tf.gradients 慢几个数量级。

相关问题:

完全包含比较 GradientTape 和 tf.gradients() 的最小示例:

编辑 - 解决方案:

xdurch0 在下面指出,我应该将 _useGradientTape() 包装在 @tf.function 中 - 由于其他原因,我之前没有成功。一旦我这样做了,我必须将 xTensor 的定义移到 @tf.function 包装器之外,方法是使其成为成员变量并使用 tf.assign()。

完成所有这些后,我发现 GradientTape(对于这个简单的示例)现在与 tf.gradints 处于同一数量级。当运行足够多的试验(~1E5)时,它的速度是 tf.gradients 的两倍。惊人的!

0 投票
1 回答
1315 浏览

python - 使用张量流梯度磁带的内存不足OOM,但仅在我附加列表时发生

我一直在使用 CNN 处理数据集 (1000,3253)。我正在通过梯度磁带运行梯度计算,但它一直在耗尽内存。但是,如果我删除将梯度计算附加到列表的行,则脚本将贯穿所有时期。我不完全确定为什么会发生这种情况,但我对 tensorflow 和梯度胶带的使用也很陌生。任何建议或意见将不胜感激