【问题标题】:In Tensorflow, what does tf.GradientTape.gradients do when its "target" attribute is a multi-dimensional tensor?在Tensorflow中,当tf.GradientTape.gradients的“target”属性是多维张量时,它做了什么?
【发布时间】:2021-04-05 07:10:23
【问题描述】:

在我的模型中,我使用 tf.keras.losses.MSE 来计算我的 BATCH_SIZE x 256 x 256 x 3 输出和我的BATCH_SIZE x 256 x 256 x 3 输入。

这个函数的输出似乎是(None,256,256)

然后我使用 tf.GradientTape.gradients,将 MSE output 作为“target”属性。在文档中,它说这个属性可以是张量。

我的理解是 loss 是一个标量数,它在反向传播期间与每个权重不同。

因此,我的问题是:将多维张量传递给梯度函数时会发生什么?张量中所有元素的总和是否简单计算?

我问这个是因为我的模型目前没有训练,每个时期的损失读数都是 1.0。我的假设是我没有正确计算梯度,因为每个权重的所有梯度都读取为 0.0。

【问题讨论】:

  • 您需要将每像素损失减少到一个标量。使用tf.math.reduce_mean

标签: tensorflow keras


【解决方案1】:
import tensorflow as tf
x = tf.Variable([3.0, 2.0])
with tf.GradientTape() as g:
  g.watch(x)
  y = x * x
dy_dx = g.gradient(y, x)
print(dy_dx)
print(y)

Result: 
tf.Tensor([6. 4.], shape=(2,), dtype=float32)
tf.Tensor([9. 4.], shape=(2,), dtype=float32)

如上图所述,tf.GradientTape.gradient 只是计算梯度 dy/dx。在您有多个变量的情况下, tf 似乎计算相应张量的导数,而不是自动对它们求和。

【讨论】:

  • 然后应用渐变对 multidim 张量有什么作用?
  • @DanielWiczew 如果你问apply_gradients 做了什么,优化器中定义的这个函数接收梯度和变量的元组,然后执行某种操作来修改变量(例如 Adam、SGD )。
猜你喜欢
  • 1970-01-01
  • 2016-04-09
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2020-12-09
相关资源
最近更新 更多