RegisterGradient预期的TensorFlow奇怪(随机?)输出

时间:2017-11-07 23:51:41

标签: python tensorflow

我使用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 partc++ op

使用TensorFlow 1.2.1和python 2.7

1 个答案:

答案 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

虽然我的答案似乎有点迟了,但仍然希望它有所帮助!