为什么梯度在以下函数中未连接?
Why the gradients are unconnected in the following function?
我正在实施一个必须计算梯度的客户操作。以下是函数:
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() 正在返回 None,这是我为计算梯度而编写的代码
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))
我找不到梯度未连接的原因。是 result 变量导致的吗?请提出替代实施方案。
是的,为了计算梯度,我们需要对您的变量进行一组(可微分的)操作。
你应该 re-write difference
作为 2 个输入张量的函数。我认为(虽然很高兴承认我不是 100% 肯定!)是 'assign' 的使用导致渐变带掉落。
也许是这样的:
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)
会给你想要的结果
我正在实施一个必须计算梯度的客户操作。以下是函数:
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() 正在返回 None,这是我为计算梯度而编写的代码
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))
我找不到梯度未连接的原因。是 result 变量导致的吗?请提出替代实施方案。
是的,为了计算梯度,我们需要对您的变量进行一组(可微分的)操作。
你应该 re-write difference
作为 2 个输入张量的函数。我认为(虽然很高兴承认我不是 100% 肯定!)是 'assign' 的使用导致渐变带掉落。
也许是这样的:
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)
会给你想要的结果