问题标签 [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 回答
104 浏览

computer-vision - 计算从中间层获取的输出的梯度并使用优化器更新权重

我正在尝试实现以下架构,但不确定是否正确应用渐变胶带。

LFFD 研究论文

在上面的架构中,我们可以看到,蓝色框中的输出来自多个层。每个蓝色框在论文中被称为损失分支,其中包含两个损失,即交叉熵和 l2 损失。我在 tensorflow 2 中编写了架构,并使用梯度磁带进行自定义训练。我不确定的一件事是我应该如何使用梯度胶带更新损失。

我有两个疑问,

  1. 在这种情况下,我应该如何使用渐变胶带进行多次损失。我有兴趣看代码!
  2. 例如,考虑上图中的第 3 个蓝色框(第 3 个损失分支),我们将从conv 13层获取输入并获得两个输出,一个用于分类,另一个用于回归。因此,在计算了我应该如何更新权重的损失之后,我应该更新上面的所有层(从 conv 1 到 conv 13)还是应该只更新获取我conv 13的层权重(conv 11、12 和 13) .

我还附上了一个链接,我昨天在该链接中详细发布了一个问题。

下面是我尝试过的梯度下降的片段。如果我错了,请纠正我。

下面是自定义损失函数的代码,它被用作上面的 loss_criterion。

我没有收到任何错误,但我的损失并没有减少。这是我的训练日志

有人请帮我解决这个问题。

0 投票
0 回答
673 浏览

python - 尝试使用 tf.GradientTape() 进行自定义训练时,“所有输入的形状必须匹配”错误损失函数

我正在使用 Python 3.7.7。和带有功能 API 和急切执行的 Tensorflow 2.1.0。

我正在尝试使用从 U-Net 预训练网络中提取的编码器进行自定义训练:

  1. 我没有编译就得到了 U-Net 模型。
  2. 我已将权重加载到模型中。
  3. 我已经从该模型中提取了编码器和解码器。

然后我想将编码器与此摘要一起使用:

我使用此功能进行自定义培训:

grad功能是:

但是当我尝试运行它时,我得到了错误:

loss函数中,我检查了y_变量的值。y_是具有这些形状的 6 个元素的列表:

关于它发生了什么的任何想法?

如果您需要更多详细信息,请询问我。

这是完整的调用堆栈:

0 投票
0 回答
604 浏览

python - TensorFlow RuntimeError:“尝试在不构建函数的情况下捕获 EagerTensor”

我正在尝试在 Python 中构建一个神经网络来解决 PDE,因此,我不得不编写自定义训练步骤。我的训练功能如下所示:

由于我的硬件,我别无选择,只能使用 tensorflow==1.12.0 和 keras==2.2.4。
当我运行此代码时,我得到“RuntimeError: Attempting to capture an EagerTensor without building a function”。我看过其他关于此的帖子,但所有答案都说要更新 tensorflow/keras,我不能,使用我已经完成的“tf.enable_eager_execution()”和“tf.disable_v2_behavior()” ,这在旧版本的 tensorflow 上不存在。我还能做些什么来解决这个问题吗?该错误让我认为 tensorflow 想要我添加@tf.function,但 tensorflow 1 中似乎也不存在该功能。

0 投票
0 回答
41 浏览

python - 相对于模型输出的 TensorFlow 损失梯度给出 None

我试图将我的损失函数与training_stepa 函数中的模型输出区分开来tf.keras.Model。这是我的尝试:

我将tape1用于以后需要的渐变。首先,dyNone,我该如何解决这个问题?其次,是否允许在我的模型的 - 方法中返回两个输出值,training=True而在 时只返回一个?即使我不这样做是吗?calltraining=FalsedyNone

编辑:如果我在train_step函数之外执行以下操作,它的结果确实不同于None

0 投票
0 回答
107 浏览

tensorflow - 如何在 Tensorflow 2.0 (TFP) 中调试爆炸梯度(协方差矩阵)

一个问题来自于我从未如此深入地在 TF 中调试我的模型。

我正在使用 Tensorflow Probability 进行全秩高斯近似的变分推理。我注意到我的优化经常爆发。这是我的损失曲线

我怀疑数值问题,因为所有损失和优化过程看起来都很合理,而且我没有观察到任何 NaN。

我使用通过默认对角线移位tfp.distributions.MultivariateNormalTriL转换的协方差参数。tfp.bijectors.FillScaleTriL协方差矩阵的条件数是合理的。变分推理是用fit_surrogate_posterior函数执行的。

我使用带有动量的 SGD 进行优化,每次迭代使用 10 个样本。

在 Tensorflow Probability 源代码内部,最小化目标使用梯度带:

为了解决我的问题,我想通过每个操作查看渐变。

我的问题是如何更深入地了解梯度计算正在爆炸的操作?如何获得每个张量的梯度值?

如果你们中的任何人遇到类似的问题: 有没有更好的方法来防止协方差矩阵优化中的不稳定性?

详细解释:

我观察到这种爆炸是由一个参数引起的(尽管爆炸的参数并不总是相同)。这可以通过比较爆炸前两次迭代的协方差矩阵来简单地检查

以及在损失爆发点之前的一次迭代

注意最后一个参数。当我多次运行相同的优化时,可能会发生“小”参数之一(从 9 到最后的行)在某个时候爆炸。

谢谢,马特乌斯

0 投票
0 回答
2389 浏览

python - 错误轮询事件状态:未能查询事件:CUDA_ERROR_LAUNCH_FAILED:未指定的启动失败

我已经为这个问题苦苦挣扎了五天,并阅读了 StackOverflow 上的几篇文章,但仍然无法清楚地了解如何解决这个问题。 解决此问题的人只是建议尝试不同的 NVIDIA 驱动程序版本,直到找到与特定 GPU 卡的 CUDA 版本(主要是 10.1)匹配的幸运版本。

我在一个桌面(Windows 10、64 位操作系统)上有一个NVIDIA GeForce GTX 1015 Ti ,在另一个桌面(Windows 10、64 位系统)上有一个NVIDIA GeForce RTX 2080Ti。我按照TensorFlow官网的硬件要求安装了GPU驱动(1050 Ti GPU试了418.81和457.09版本,2080 Ti GPU试了432.00、457.30版本)、CUDA Toolkit(两个桌面都是10.1)、cuDNN(7.6 .0 对于两个桌面)并PATH最终修改了环境变量。TensorFlow 版本为 2.3.0,Python 版本为 3.7.9。

使用 TensorFlow 网站上的示例代码,这对 MNIST 训练数据集很有效。但是当我运行一些自定义代码(我有一个从 Keras.Model 继承的自定义模型)时,我总是在两台 PC 上遇到以下错误:

我没有将 TensorFlow 用于传统的神经网络训练,而只是利用自动微分机制来解决优化问题。

我认为我的自定义代码没有问题,因为它在Google Colab上运行良好。同样的代码在我朋友的 Linux 系统上运行良好。

重现错误的代码(在 Google Colab 上运行没有问题):

内核死在grads = tape.gradient(loss, variables)

两台电脑的错误:

谁能告诉我如何解决这个问题?盲目地尝试不同版本的驱动程序是使其工作的唯一方法吗?

奇怪的是,如果我在 PC 上使用 Keras API这个例子运行神经网络训练,就没有这样的错误。如果我用这个线性回归示例GradientTape编写一些非常简单的代码来计算梯度,也没有错误......这样,似乎驱动程序安装正确......真的很混乱

0 投票
2 回答
238 浏览

tensorflow - GradientTape 计算损失函数中的显着性

我正在尝试构建一个LSTM 网络来对句子进行分类并使用显着性为分类提供解释。这个网络必须从真正的班级y_true以及他不应该注意的单词中学习Z(二进制掩码)。

这篇论文启发了我们提出我们的损失函数。这是我希望我的损失函数看起来像的样子:

在此处输入图像描述

Coût de classification在下面的代码中转换为classification_loss和转换Coût d'explication (saillance)saliency_loss(与输入的输出梯度相同)。我尝试使用 Keras 中的自定义模型来实现这一点,并使用 Tensorflow 作为后端:

我设法计算classification_loss得很好saliency_loss,我得到了一个标量值。但是,这行得通:tape.gradient(classification_loss, trainable_vars)但这不起作用tape.gradient(classification_loss + saliency_loss, trainable_vars)并且 throws ValueError: No gradients provided for any variable

0 投票
2 回答
388 浏览

tensorflow - 如何在使用自定义训练循环时利用 class_weights 计算自定义损失函数(即不使用 .fit )

我已经使用tf.GradientTape(). 我的数据有 2 个类。班级不平衡;class1数据贡献了近 80% 和class2剩余的 20%。因此,为了消除这种不平衡,我尝试编写自定义损失函数,它将考虑这种不平衡并应用相应的类权重并计算损失。即我想使用class_weights = [0.2, 0.8]. 我找不到类似的例子。

但是,我看到的所有示例都使用 model.fit 方法,它更容易通过class_weights. 我无法找到class_weights与自定义训练循环一起使用的示例tf.GradientTape

我确实通过了使用的建议sample_weight,但是我没有可以在其中指定样本权重的数据,因此我的偏好是使用类权重。

我使用BinaryCrossentropy损失作为损失函数,但我想根据class_weights. 这就是我被卡住的地方,如何告诉BinaryCrossentropy考虑class_weights.

我使用自定义损失函数的方法是正确的,还是有更好的方法来使用class_weights自定义训练循环(不使用model.fit)进行训练?

0 投票
0 回答
374 浏览

python - 为什么手动观察模型变量时 tf.GradientTape() 的 GPU 内存使用量较少?

因此,当我使用 tf.GradientTape() 自动监控 resnet 模型中的可训练变量时,计算机抛出了内存不足错误。下面是代码:

但是,如果我禁用自动监控并手动观察可训练变量,我可以输入更大的数据而不会出现任何内存问题。代码如下:

我想知道当我手动操作时磁带是否遗漏了一些变量。

以下是可运行代码(如果您评论选项 1,将显示内存不足错误):我使用Tesla T415G GPU 和tensorflow 2.3.

还有错误信息:

0 投票
1 回答
50 浏览

python - 如何访问在 tf.function 中更新的张量值(例如指标)?

我一直在研究一个模型,其训练循环使用tf.function包装器(急切运行时出现 OOM 错误),并且训练似乎运行良好。但是,我无法访问自定义训练函数返回的张量值(如下)

我的“伞”训练循环的简化版本如下:

当我尝试打印损失值时,最终出现以下错误:

AttributeError:“张量”对象没有属性“numpy”

我也尝试使用 tf.print() 如下:

但是终端上似乎什么也没有出现。有什么建议么?