1

我正在实施必须计算梯度的客户操作。下面是函数:

def difference(prod,box):
    result = tf.Variable(tf.zeros((prod.shape[0],box.shape[1]),dtype=tf.float16))
    for i in tf.range(0,prod.shape[0]):
        for j in tf.range(0,box.shape[1]):
            result[i,j].assign((tf.reduce_prod(box[:,j])-tf.reduce_prod(prod[i,:]))/tf.reduce_prod(box[:,j]))
    return result

我无法计算关于盒子的梯度,tape.gradient() 返回无,这是我为计算梯度而编写的代码

prod = tf.constant([[3,4,5],[4,5,6],[1,3,3]],dtype=tf.float16)
box = tf.Variable([[4,5],[5,6],[5,7]],dtype=tf.float16)
with tf.GradientTape() as tape:
    tape.watch(box)
    loss = difference(prod,box)
    print(tape.gradient(loss,box))

我无法找到未连接渐变的原因。结果变量是导致它的原因吗?请提出替代实施方案。

4

1 回答 1

1

是的,为了计算梯度,我们需要对变量进行一组(可微分)操作。

您应该重写difference为 2 个输入张量的函数。我认为(尽管很高兴承认我不是 100% 确定!)是使用“分配”使渐变胶带倒塌。

也许是这样的:

def difference(prod, box):
  box_red = tf.reduce_prod(box, axis=0)
  prod_red = tf.reduce_prod(prod, axis=1)
  return (tf.expand_dims(box_red, 0) - tf.expand_dims(prod_red, 1)) / tf.expand_dims(box_red, 0)

会给你想要的结果

于 2020-08-24T11:15:41.160 回答