theano(python):元素渐变

时间:2015-12-01 15:20:02

标签: python theano elementwise-operations

我正在尝试使用

执行元素渐变

如,

output-f(x):5乘1矢量,

关于 input-X:5 by 1 vector

我可以这样做,

 import theano
 import theano.tensor as T

 X = T.vector('X')   

 f = X*3    

 [rfrx, []] = theano.scan(lambda j, f,X : T.grad(f[j], X), sequences=T.arange(X.shape[0]), non_sequences=[f,X])

 fcn_rfrx = theano.function([X], rfrx)

 fcn_rfrx(np.ones(5,).astype(float32))

,结果是

array([[ 3.,  0.,  0.,  0.,  0.],
       [ 0.,  3.,  0.,  0.,  0.],
       [ 0.,  0.,  3.,  0.,  0.],
       [ 0.,  0.,  0.,  3.,  0.],
       [ 0.,  0.,  0.,  0.,  3.]], dtype=float32)

但由于效率不高,我希望得到5乘1的矢量

做类似的事情。

 [rfrx, []] = theano.scan(lambda j, f,X : T.grad(f[j], X[j]), sequences=T.arange(X.shape[0]), non_sequences=[f,X])

哪个不起作用。

有没有办法做到这一点? (抱歉格式不好。我是新来的并且学习)

(我添加了更明确的例子):

给定输入向量:x [1],x [2],...,x [n]

和输出向量:y [1],y [2],..,y [n],

其中y [i] = f(x [i])。

我想要

的结果

仅限df(x [i])/ dx [i]

而不是

df(x [i])/ dx [j] for(i< j> j)

,计算效率(n是数据数> 10000)

1 个答案:

答案 0 :(得分:3)

您正在寻找theano.tensor.jacobian

import theano
import theano.tensor as T

x = T.fvector()
p = T.as_tensor_variable([(x ** i).sum() for i in range(5)])

j = T.jacobian(p, x)

f = theano.function([x], [p, j])

现在评估收益率

In [31]: f([1., 2., 3.])
Out[31]: 
[array([  3.,   6.,  14.,  36.,  98.], dtype=float32),
 array([[   0.,    0.,    0.],
        [   1.,    1.,    1.],
        [   2.,    4.,    6.],
        [   3.,   12.,   27.],
        [   4.,   32.,  108.]], dtype=float32)]

如果您只对一个或几个偏导数感兴趣,您也可以只获得它们。有必要仔细研究theano优化规则,以便能够看到它获得了多少效率(基准测试是第一次测试)。 (有可能已经对渐变进行索引使得theano明白它不需要计算其余部分)。

x = T.fscalar()
y = T.fvector()
z = T.concatenate([x.reshape((1,)), y.reshape((-1,))])

e = (z ** 2).sum()
g = T.grad(e, wrt=x)

ff = theano.function([x, y], [e, g])