提交 c9d6cfe0 authored 作者: Marc-Alexandre Cote's avatar Marc-Alexandre Cote

Added a C version for the CumsumOp.

上级 6a99f986
...@@ -36,7 +36,6 @@ class CumsumOp(theano.Op): ...@@ -36,7 +36,6 @@ class CumsumOp(theano.Op):
def grad(self, inputs, output_gradients): def grad(self, inputs, output_gradients):
[gi] = output_gradients [gi] = output_gradients
gi = theano.printing.Print("Grad")(gi)
if self.axis is None: if self.axis is None:
return [cumsum(gi[::-1])[::-1].reshape(inputs[0].shape)] return [cumsum(gi[::-1])[::-1].reshape(inputs[0].shape)]
...@@ -54,6 +53,41 @@ class CumsumOp(theano.Op): ...@@ -54,6 +53,41 @@ class CumsumOp(theano.Op):
return shapes return shapes
def c_code(self, node, name, inames, onames, sub):
x, = inames
z, = onames
axis = self.axis
fail = sub['fail']
if self.axis is None:
code = """
npy_intp shape[1] = { PyArray_SIZE(%(x)s) };
Py_XDECREF(%(z)s);
%(z)s = (PyArrayObject*) PyArray_SimpleNew(1, shape, type_num_%(x)s);
if (!%(z)s)
%(fail)s;
{
PyArray_CumSum(%(x)s, NPY_MAXDIMS, type_num_%(x)s, %(z)s);
}
""" % locals()
else:
code = """
Py_XDECREF(%(z)s);
%(z)s = (PyArrayObject*) PyArray_SimpleNew(PyArray_NDIM(%(x)s), PyArray_SHAPE(%(x)s), type_num_%(x)s);
if (!%(z)s)
%(fail)s;
{
PyArray_CumSum(%(x)s, %(axis)s, type_num_%(x)s, %(z)s);
}
""" % locals()
return code
def c_code_cache_version(self):
return (1,)
def __str__(self): def __str__(self):
return self.__class__.__name__ return self.__class__.__name__
......
...@@ -24,11 +24,11 @@ class TestCumsumOp(utt.InferShapeTester): ...@@ -24,11 +24,11 @@ class TestCumsumOp(utt.InferShapeTester):
x = T.tensor3('x') x = T.tensor3('x')
a = np.random.random((30, 50, 20)).astype(config.floatX) a = np.random.random((30, 50, 20)).astype(config.floatX)
f = theano.function([x], cumsum(x)) f = theano.function([x], cumsum(x), mode="DebugMode")
assert np.allclose(np.cumsum(a), f(a)) # Test axis=None assert np.allclose(np.cumsum(a), f(a)) # Test axis=None
for axis in range(len(a.shape)): for axis in range(len(a.shape)):
f = theano.function([x], cumsum(x, axis=axis)) f = theano.function([x], cumsum(x, axis=axis), mode="DebugMode")
assert np.allclose(np.cumsum(a, axis=axis), f(a)) assert np.allclose(np.cumsum(a, axis=axis), f(a))
def test_infer_shape(self): def test_infer_shape(self):
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论