Я пытаюсь определить пользовательский опера theano с градиентом, чтобы использовать его с pymc3, но я не понимаю, как определить метод grad
.
Код ниже, где я застрял,Функция phi()
является фиктивной (на практике это внешняя программа);для скалярного входа x
возвращается вектор (phi_0(x), phi_1(x), ...)
.Функция phi_diff()
(также фиктивная функция) возвращает вектор (dphi_0/dx, dphi_1/dx, ...)
.
Я завернул phi()
и phi_diff()
в объект theano.Op
, но моя реализация функции grad
не даетРабота.Документация theano содержит более простые примеры, я не понимаю, как их адаптировать в этом случае.Любая помощь будет принята с благодарностью.
import numpy as np
import theano.tensor as T
import theano
theano.config.optimizer = "None"
theano.config.exception_verbosity = "high"
def phi(x):
return np.arange(n) * x
def phi_diff(x):
return np.arange(n)
class PhiOp(theano.Op):
itypes = [theano.tensor.dscalar]
otypes = [theano.tensor.dvector]
def perform(self, node, inputs, output_storage):
x = inputs[0]
output_storage[0][0] = phi(x)
def grad(self, inputs, output_grads):
x = inputs[0]
# ???
return [PhiDiffOp()(x) * output_grads[0]]
class PhiDiffOp(theano.Op):
itypes = [theano.tensor.dscalar]
otypes = [theano.tensor.dvector]
def perform(self, node, inputs, output_storage):
x = inputs[0]
output_storage[0][0] = phi_diff(x)
n = 5
x = 777.
phi_op = PhiOp()
x_tensor = T.dscalar("x_tensor")
phi_func = theano.function([x_tensor], phi_op(x_tensor))
np.testing.assert_allclose(phi_func(x), phi(x))
T.jacobian(phi_op(x_tensor), x_tensor)