1

我不确定之前是否有人问过这个问题,但我在使用自定义损失函数计算梯度时遇到了问题。我不太确定如何为问题命名,但似乎除非我直接在损失计算中使用模型输出,否则我会收到以下错误:

 Error in py_call_impl(callable, dots$args, dots$keywords) : 
    ValueError: No gradients provided for any variable: [ list of model variables ]

我失败的损失计算是:

    : :
    out <- as.matrix(mdl_output$numpy())
    act <- matrix(rep(1:nrow(out)), ncol=ncol(out), nrow=nrow(out), byrow=TRUE)
    rnk <- tf$Variable(rowApply(out, Rank), dtype=tf$float32)
    return(
        tf$losses$mean_squared_error(
            labels= act,
            predictions=rnk
        )
    )

grad_tape$gradient(mdl_loss, mdl$variables) 函数返回一个空列表。但是,以下工作:

    : :
    out <- as.matrix(mdl_output$numpy())
    act <- matrix(rep(1:nrow(out)), ncol=ncol(out), nrow=nrow(out), byrow=TRUE)
    rnk <- tf$Variable(rowApply(out, Rank), dtype=tf$float32)
    prd <- tf$add(tf$subtract(mdl_output, mdl_output), rnk)
    return(
        tf$losses$mean_squared_error(
            labels= act,
            predictions=prd
        )
    )

请注意,prd是使用mdl_output 构建的,而rnk是使用来自 numpy 数组的 R 矩阵构建的。

为什么我需要做后者?prd传递的内容以某种方式被rnk丢失了?

FWIW:我正在使用带有急切执行的 R tensorflow 和 keras 包。

4

0 回答 0