我试图对元素进行梯度操作,例如:
输出-f(x):5×1向量,
关于输入X:5×1向量
我可以这样做:
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] 的结果,而不需要 (i<>j) 时的 df(x[i])/dx[j]。
这样可以提高计算效率(n 表示数据量大于 10000)。
f.sum()
,并计算相对于X的梯度吗? - Alleoy[i] = f(x[i])
),在进行求和并计算梯度时不会出现问题。Theano应该减少不必要的计算。 - Alleo