Стремительное выполнение Tensorflow не получает градиентов, если потери не рассчитываются напрямую с использованием вывода модели - PullRequest
0 голосов
/ 23 июня 2019

Я не уверен, задавалось ли это раньше, но я столкнулся с проблемой вычисления градиентов с пользовательской функцией потерь. Я не совсем уверен, как озаглавить вопрос, но кажется, что, если я не использую вывод модели непосредственно в вычислении потерь, я получаю следующую ошибку:

 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 с нетерпеливым исполнением.

...