kri*_*nab 31 tensorflow eager-execution
我在Tensorflow上观看了关于Eager Execution的Tensorflow开发者峰会视频,并且演示者介绍了"渐变磁带".现在我了解Gradient Tape跟踪TF模型中发生的自动差异.
我试图理解为什么我会使用Gradient Tape?任何人都可以解释Gradient Tape如何用作诊断工具吗?为什么有人会使用Gradient Tape而不仅仅是权重的Tensorboard可视化.
因此,我认为模型发生的自动区分是计算每个节点的梯度 - 这意味着在给定一批数据的情况下,调整每个节点的权重和偏差.这就是学习过程.但我的印象是,我实际上可以使用一个tf.keras.callback.TensorBoard()调用来查看训练的张量板可视化 - 所以我可以观察每个节点上的权重并确定是否有任何死或过饱和的节点.
仅使用渐变色带来查看某些渐变是否变为零或变得非常大等等?或者是否有其他一些使用渐变色带?
iyo*_*p45 33
启用急切执行后,Tensorflow将计算代码中出现的张量值.这意味着它不会预先计算通过占位符输入输入的静态图.这意味着要反向传播错误,您必须跟踪计算的渐变,然后将这些渐变应用于优化器.
这与没有急切执行的运行非常不同,您可以在其中构建图表,然后使用它sess.run来评估您的损失,然后直接将其传递给优化器.
从根本上说,由于张量是立即进行评估的,因此您没有用于计算渐变的图表,因此需要使用渐变色带.它不仅仅用于可视化,而是在没有它的情况下无法在急切模式下实现梯度下降.
显然,Tensorflow可以跟踪每个计算的每个梯度tf.Variable.但是,这可能是一个巨大的性能瓶颈.它们会显示渐变磁带,以便您可以控制代码的哪些区域需要渐变信息.请注意,在非渴望模式下,这将基于作为损失后代的计算分支进行静态确定,但在急切模式下,没有静态图,因此无法知道.
kri*_*nab 10
经过一段时间的研究,在发布了最初的问题之后,我对梯度带在哪里有用有了更好的认识。例如,当您在keras模型中设计自定义图层时,或者等效地为模型设计自定义训练循环时,似乎最有用的Gradient Tap应用程序就是Gradient Tap 。
如果您有一个自定义层,则可以精确定义操作在该层中的发生方式,包括计算出来的梯度,还可以计算出累积的损耗量。
因此,“渐变色带”将仅使您直接访问图层中的各个渐变。
这是Aurelien Geron的第二版Tensorflow书中的示例。
假设您有想要激活的功能。
def f(w1, w2):
return 3 * w1 ** 2 + 2 * w1 * w2
Run Code Online (Sandbox Code Playgroud)
现在,如果您想对re w1和和分别使用此函数的派生w2:
w1, w2 = tf.Variable(5.), tf.Variable(3.)
with tf.GradientTape() as tape:
z = f(w1, w2)
gradients = tape.gradient(z, [w1, w2])
Run Code Online (Sandbox Code Playgroud)
因此,优化器将计算渐变并允许您访问这些值。然后,您可以根据需要将它们加倍,平方,加倍等等。无论选择做什么,都可以将这些调整后的梯度添加到反向传播步骤等的损耗计算中。
我想在回答说,这个问题最重要的事情很简单,GradientTape是不是诊断工具。这就是这里的误解。
GradientTape是自动微分(autodiff)的数学工具,是TensorFlow的核心功能。它不“跟踪”自动差异,它是执行自动差异的关键部分。
正如其他答案所描述的那样,它用于记录(“磁带”)对某些输入执行的一系列操作并产生某些输出,以便可以根据输入区分输出(通过反向传播/反向模式 autodiff) (为了然后执行梯度下降优化)。
| 归档时间: |
|
| 查看次数: |
5943 次 |
| 最近记录: |