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