tensorflow无法获得梯度wrt嵌入矩阵

时间:2018-10-17 02:05:32

标签: python tensorflow

我使用tensorflow实现了端到端的lambdaRank检索模型。有3个模块:rep_module,inter_module和L2R_module。嵌入(emb_mat)在L2R_module中定义,并作为参数传递给rep_module和inter_module: 因此,聚合的L2R模块将具有:

self.emb_mat = tf.get_variable("emb_mat",
        shape=[self.vocab_size, self.emb_dim], dtype=tf.float32)
self.rep_mod = RepModule(...., emb_mat=self.emb_mat)
self.inter_mod = InterModule(..., emb_mat=self.emb_mat)

目标是让rep和inter模块共享emb_mat,并与这两个模块一起学习。这个L2R模块将输出一批分数:score =(Batch_size,1)

然后,我还有另一个更高级别的lambdaRank模块来手动计算渐变(我无法使用自优化器中的内置功能,因为我必须获取等级并将其与lambda等级中的值相乘)。我有一个_jacobian(y,x)函数,如下所示:

  def _jacobian(self, y_flat, x):
    """
    https://github.com/tensorflow/tensorflow/issues/675
    for ranknet and lambdarank
    """

    loop_vars = [
        tf.constant(0, tf.int32),
        tf.TensorArray(tf.float32, size=self.batch_size),
    ]

    _, jacobian = tf.while_loop(
        lambda j, _: j < self.batch_size,
        lambda j, result: (j + 1, result.write(j, tf.gradients(y_flat[j], x))),
        loop_vars)

    return jacobian.stack()  

它将计算y wrt x的每个元素的等级,并将它们重新组合在一起。 我可以得到除emb_mat以外的所有其他变量(模型参数)的所有分数的雅可比式分数。我的其他变量就像tf.layers ..变量

  

tf。变量'conv1 / conv1d / kernel:0'shape =(3,300,256)dtype = float32_ref,

,但无法计算emb_mat的梯度。 它返回类似: TypeError: Failed to convert object of type <class 'list'> to Tensor. Contents: [<tensorflow.python.framework.ops.IndexedSlices object at 0x7f025e161f28>]TypeError: Expected binary or unicode string, got <tensorflow.python.framework.ops.IndexedSlices object at 0x7f025e161f28>

0 个答案:

没有答案