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

tensorflow2.0 - 如何为我的张量流模型的特定层打印梯度值?

我正在 TensorFlow 2.3 中训练模型

我想查看模型不同层的渐变值。

我知道如何访问模型的各个层。

它提供以下输出 -

在此处输入图像描述

如何打印所有这些可训练层的梯度值?

0 投票
1 回答
86 浏览

function - 为什么我不能对作为参数传递给 tf.function 的变量执行渐变?

我的训练循环给了我以下警告:

警告:张量流:当最小化损失时,变量 ['noise:0'] 不存在梯度。

经过一番修补后,我确定这只发生在噪声变量作为参数传递给我的损失函数(即 tf.function)时。下面的代码表明,当损失函数不是 tf.function 或者函数中引用了全局噪声变量时,没有问题。它还表明,当噪声变量用作 tf.function 中的参数时,尝试对噪声变量执行梯度会导致错误:

此代码打印:

[<tf.Tensor: shape=(), dtype=float64, numpy=0.045454545454545456>]
[<tf.Tensor: shape=(), dtype=float64, numpy=0.045413242911911206>]
[<tf.Tensor: shape=() , dtype=float64, numpy=0.04537197429557289>]
[无]

然后它返回错误消息:

ValueError:没有为任何变量提供渐变:['noise:0']。

理想情况下,我会得到 tf.function 的性能提升,所以我不想使用 loss_function_1。另外,我希望能够将不同的噪声变量传递给我的损失函数,所以我不想像在 loss_function_2 或 loss_function_3 中那样使用全局变量。

当我尝试对作为参数传递给 tf.function 的变量执行渐变时,为什么会得到 None?我怎样才能解决这个问题?

0 投票
0 回答
18 浏览

tensorflow - 在 Tensorflow 中实现实例相关/条件损失

我希望能够根据给定批次中发生的实例计算条件损失(两种不同的损失)。我正在从头开始编写自定义 train_step,因为我相信这提供了实现我所想的灵活性。但是,我有点纠结于如何实现这一点。

在每个训练步骤,我都在计算批次中每个实例的真实标签和预测标签之间的分类(分类交叉熵)损失,这是标准的。此外,我还包括了一个正则化损失,该损失不是针对批次中的每个实例计算的,而只是实例的一个子集。这就是为什么我提到一个有条件的损失或两个损失目标。

在训练之前,我已经指定了训练实例 id 的列表(每个训练实例都有一个唯一的 id)。每当这些实例中的任何一个碰巧在当前批次中时,我都会仅使用这些特定实例来计算正则化项。如果这些情况都没有发生,我只计算标准分类损失。正则化项的目标是鼓励特定训练实例(由实例 id 指定)和一组附加实例(现在我们可以假设单个实例)之间的特征相似性,以平方距离衡量。

这是我到目前为止所拥有的。这不是一个有效的实现,但希望能展示我所描述的以及我希望实现的目标。模型接受图像张量并输出特征表示(用于正则化项)和预测向量(用于分类损失)。随意忽略我正在使用的方法并建议替代方法。例如,改为创建自定义损失函数或使用tf.cond可能会有所帮助。注意:我正在使用 tensorflow 2/ tf.GradientTape()

0 投票
1 回答
191 浏览

tensorflow - Tensorflow 变分自动编码器的自定义训练循环:`tape.gradient(loss, decoder_model.trainable_weights)` 总是返回全无的列表

我正在尝试为由两个独立tf.keras.Model对象组成的变分自动编码器 (VAE) 编写自定义训练循环。这个 VAE 的目标是多类分类。像往常一样,编码器模型的输出作为解码器模型的输入。解码器是循环解码器。同样像往常一样,VAE 中涉及两个损失函数:重建损失(分类交叉熵)和潜在损失。我当前架构的灵感来自这个github上的 pytorch 实现。

问题:每当我使用tape.gradient(loss, decoder.trainable_weights)解码器模型计算梯度时,返回的列表中每个元素只有 NoneType 对象。我假设我在使用 时犯了一些错误reconstruction_tensor,它位于我在下面编写的代码的底部附近。由于我需要进行迭代解码过程,如何在reconstruction_tensor不返回 NoneType 渐变元素列表的情况下使用类似的东西?如果您愿意,可以使用此colab 笔记本运行代码。

为了进一步阐明这个问题中的张量是什么样的,我将说明原始输入、将分配预测“令牌”的零张量,以及基于来自解码器的预测“令牌”对零张量的单次更新:

这是重现问题的代码:

0 投票
1 回答
123 浏览

python - 使用 tf.GradientTape() wrt 输入的梯度为无(Tensorflow 2.4)

这是我的模型。我使用 TensorFlow 2.4.1。

当我运行以下代码时,我得到None渐变 wrt 输入。

这是一个示例输入,以及调用

None

我究竟做错了什么 ?

谢谢

0 投票
2 回答
95 浏览

python - tf.GradientTape() 为我的神经网络函数返回 None 值

所以我创建了自己的神经网络,我想对输入变量进行自动微分。我的神经网络代码是这样的

并且tf.GradientTape(),我试图用这个来区分神经网络

哪个结果None。我在这里做错了什么?

0 投票
1 回答
206 浏览

python - 使用 tf.GradientTape 的自定义 GAN 训练循​​环返回 [None] 作为生成器的梯度,而它适用于鉴别器

我正在尝试训练 GAN。不知何故,生成器的梯度返回 None,即使它返回鉴别器的梯度。这导致ValueError: No gradients provided for any variable: ['carrier_freq:0'].优化器将梯度应用于权重(在这种情况下,只有一个权重,应该是一个梯度)。我似乎找不到原因,因为计算应该几乎相同。

这是生成器的梯度返回 [None] 的训练步骤的代码。

这里有一些关于那里发生了什么
的信息: 鉴别器的目标是区分合法样本和对抗样本。鉴别器接收双倍的批次。一旦批处理以合法数据的方式进行预处理,并再次以产生对抗性数据的方式进行预处理,即数据通过生成器并在那里进行修改。
生成器现在只有一个权重,由包装在 lambda 层中的加法和乘法运算组成。
损失计算为标签和数据之间的 BinaryCrossentropy。鉴别器接收代表每个样本是否被修改的真实标签。生成器损失的计算类似,但它只考虑修改过的样本和代表合法样本的标签。所以它基本上衡量了有多少对抗样本被鉴别器分类为合法样本。

现在解决问题:
两种损失计算似乎都有效,因为它们返回了一个值。梯度的计算也适用于鉴别器。但是生成器的梯度返回[None]。它应该与鉴别器梯度的计算非常相似,因为不同之处在于损失计算仅使用用于鉴别器损失的数据的子集。另一件事是,生成器只有一个权重,由 lambda 层组成,进行乘法和加法,而鉴别器是一个密集网络,具有多个权重。

有谁知道问题的根源可能是什么?

0 投票
1 回答
95 浏览

tensorflow - 在自定义训练循环中计算梯度,TF 与 Torch 的性能差异

我试图将计算分子结构中的力和能量的 NN 模型的 pytorch 实现转换为 TensorFlow。这需要一个自定义训练循环和自定义损失函数,所以我在下面实现了不同的一步训练函数。

  1. 首先使用嵌套渐变胶带。
  1. 使用渐变胶带的其他尝试(持久 = true)

这些是 pytorch 代码的尝试翻译

来自https://singroup.github.io/dscribe/latest/tutorials/machine_learning/forces_and_energies.html的 Dscribe 库教程

问题

与运行 pytorch 版本相比,使用任一版本的 TF 实现都会导致预测准确性的巨大损失。我想知道,我是否可能误解了 pytorch 代码并且翻译不正确,如果是,我的差异在哪里?

PS 模型直接计算能量 E,从中我们使用 E wrt D 的梯度来计算力 F。损失函数是力和能量的 MSE 的加权和。

0 投票
0 回答
37 浏览

tensorflow - 具有多个前向通道的渐变胶带

我试图通过一个接收多个输入的模型来运行道具,即 3 个不同批次的具有相同形状但不同来源的数据,其中一个批次具有一种类型的损失,其他批次具有另一种。我可以使用梯度胶带同时计算所有这些吗?

这是一个例子:

0 投票
0 回答
102 浏览

python - 使用 Tensorflow ODE Solver 获取梯度时出现 ZeroDivisionError?

我正在尝试使用 TensorFlow 实现一个机械模型,该模型将用作 GAN 的一部分,基于本文中所示的方法:https ://arxiv.org/abs/2009.08267 。我正在使用 tensorflow 2.5.0 和 tensorflow-probability 0.13.0。

机械模型使用 TF Dormand-Prince 求解器来求解一组微分方程,这些方程产生心血管系统不同区域的压力波形。我想获得关于机械模型参数的波形梯度,以训练 GAN 的生成器。

我的几个微分方程包含一个随时间变化的变量(分段但连续,没有“尖角”),它是从机械模型的参数子集计算出来的。如果我将此变量设置为常数,我可以得到波形 wrt 模型参数的梯度。但是,如果我将此变量保持为随时间变化的,那么当我尝试计算梯度时会得到 ZeroDivisionError。

知道为什么会出现此错误吗?我在下面包含了一个堆栈跟踪。

非常感谢你的帮助!