【发布时间】:2015-12-01 15:20:01
【问题描述】:
我正在尝试使用
执行逐元素渐变例如,
输出-f(x):5乘1向量,
关于 输入-X:5 x 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 x 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 (ij)
,为了计算效率(n是数据数> 10000)
【问题讨论】:
-
你能对输出求和吗:
f.sum()并取梯度 w.r.t. X? -
@Alleo 我添加了一个示例,以免混淆。这是否意味着 theano 不会自动尝试 df(x[i])/dx[j] for (ij)?
-
给定您的附加公式 (
y[i] = f(x[i])),求和然后计算梯度没有问题。 Theano 应该减少不必要的计算。 -
好的,我已经检查了它在我的情况下可以接受的速度。
标签: python theano elementwise-operations