我使用tutorial创建了一个自定义操作,并对其进行了一些修改。我想将此op用作compute_gradients
方法的输入。
我的操作需要三个输入:目标值,预测值和另一个矩阵。它返回一个与目标值具有相同形状的新矩阵。
但是,当我对此方法使用@ ops.RegisterGradient时,它需要奇怪的返回值,在一个脚本中显示此消息:
ValueError: Num gradients 1 generated for op name: "SoftDtwJacobianSqEuc"
op: "SoftDtwJacobianSqEuc"
input: "targets"
input: "mul"
input: "strided_slice"
do not match num inputs 3
这是另一个剧本:
ValueError: Num gradients 1 generated for op name: "SoftDtwJacobianSqEuc"
op: "SoftDtwJacobianSqEuc"
input: "decoder_targets"
input: "Reshape"
input: "strided_slice_8"
do not match num inputs 3
我正在运行的代码片段(完整示例如下):
# Calling the op
backwards = soft_dtw_jacobian_sq_euc_module.soft_dtw_jacobian_sq_euc(decoder_targets, decoder_predictions, alignment_matrix[1:-1,1:-1])
# Need to register, other wise get error: No gradient defined for operation...
@ops.RegisterGradient("SoftDtwJacobianSqEuc")
def _soft_dtw_jacobian_sq_euc_grad(op, grad):
# To generate the error which mentions the expected return values:
return(None)
# This kind of works in the first script, as I can 'mul'tiply the gradient with the output of the op
#return(None, soft_dtw_jacobian_sq_euc_module.soft_dtw_jacobian_sq_euc(decoder_targets, decoder_predictions, alignment_matrix[1:-1,1:-1]), None)
optimizer = tf.train.AdamOptimizer(0.02)
params = tf.trainable_variables()
gradients = optimizer.compute_gradients(backwards, params)
train_op = optimizer.apply_gradients(gradients)
为什么RegisterGradients期望不同的返回值? RegisterGradients如何确定这些?
最好我只返回op的输出(因为这就是我所做的),但如果我不使用RegisterGradient,我会得到一个“没有为操作定义的渐变...... ”错误。
我在这里有一个完整的工作示例:python part和c++ op
使用TensorFlow 1.2.1和python 2.7
答案 0 :(得分:0)
之前我有同样的错误。错误消息是在tensorflow函数gradients_impl.py
中生成的。
def _VerifyGeneratedGradients(grads, op):
"""Verify that gradients are valid in number and type.
Args:
grads: List of generated gradients.
op: Operation for which the gradients where generated.
Raises:
ValueError: if sizes of gradients and inputs don't match.
TypeError: if type of any gradient is not valid for its input.
"""
if len(grads) != len(op.inputs):
raise ValueError("Num gradients %d generated for op %s do not match num "
"inputs %d" % (len(grads), op.node_def, len(op.inputs)))
现在我们可以看到此错误意味着您的操作SoftDtwJacobianSqEuc
,您为它提供了三个输入。 TensorFlow希望您为生成渐变_soft_dtw_jacobian_sq_euc_grad
的函数提供三个输出,每个输出w.r.t为前向传播函数的每个输入。
请注意,实际上您只需要第一个输入的渐变,而其他两个渐变将不再用于反向传播,您可以再返回两个具有正确形状的fake_gradients
。
虽然我的答案似乎有点迟了,但仍然希望它有所帮助!