Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定义自定义Op theano的梯度_Python_Theano_Pymc3 - Fatal编程技术网

Python 定义自定义Op theano的梯度

Python 定义自定义Op theano的梯度,python,theano,pymc3,Python,Theano,Pymc3,我试图定义一个带有渐变的自定义theano Op,以便与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的文档包含了更简单

我试图定义一个带有渐变的自定义theano Op,以便与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)

找到解决方案,更改如下:

def phi_diff(x):
    return np.arange(n, dtype=np.float_)

class PhiOp(theano.Op):
    def grad(self, inputs, output_grads):
        x = inputs[0]
        gg = (PhiDiffOp()(x) * output_grads[0]).sum()
        return [gg]