Я не уверен, задавалось ли это раньше, но я столкнулся с проблемой вычисления градиентов с пользовательской функцией потерь. Я не совсем уверен, как озаглавить вопрос, но кажется, что, если я не использую вывод модели непосредственно в вычислении потерь, я получаю следующую ошибку:
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 $ (mdl_loss, mdl $ variable) возвращает пустой список. Тем не менее, следующие работы:
: :
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 был создан с использованием матрицы R, которая пришла из массива numpy.
Зачем мне делать последнее? Что передается prd , что каким-то образом теряется на rnk ?
FWIW: я использую пакеты R tenorflow и keras с нетерпеливым исполнением.