theano (python): 元素梯度
theano (python): elementwise gradient
我正在尝试使用
执行元素渐变
例如,
output-f(x): 5 x 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 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] 对于 (i<>j)
,为了计算效率(n是数据的数量> 10000)
您正在寻找 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])
我正在尝试使用
执行元素渐变例如,
output-f(x): 5 x 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 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] 对于 (i<>j)
,为了计算效率(n是数据的数量> 10000)
您正在寻找 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])