3

我想做以下事情:

import theano, numpy, theano.tensor as T

a = T.fvector('a')

w = theano.shared(numpy.array([1, 2, 3, 4], dtype=theano.config.floatX))
w_sub = w[1]

b = T.sum(a * w)

grad = T.grad(b, w_sub)

在这里,w_sub 是例如 w[1],但我不想在 w_sub 的函数中显式写出 b。尽管经历了这个和其他相关问题,但我无法解决它。

这只是向您展示我的问题。实际上,我真正想做的是与 Lasagne 进行稀疏卷积。权重矩阵中的零项不需要更新,因此不需要计算 的这些项的梯度w

现在这是完整的错误消息:

Traceback (most recent call last):
  File "D:/Jeroen/Project_Lasagne_General/test_script.py", line 9, in <module>
    grad = T.grad(b, w_sub)
  File "C:\Anaconda2\lib\site-packages\theano\gradient.py", line 545, in grad
    handle_disconnected(elem)
  File "C:\Anaconda2\lib\site-packages\theano\gradient.py", line 532, in handle_disconnected
    raise DisconnectedInputError(message)
theano.gradient.DisconnectedInputError: grad method was asked to compute the gradient with respect to a variable that is not part of the computational graph of the cost, or is used only by a non-differentiable operator: Subtensor{int64}.0
Backtrace when the node is created:
  File "D:/Jeroen/Project_Lasagne_General/test_script.py", line 6, in <module>
    w_sub = w[1]
4

1 回答 1

2

当 theano 编译图时,它只会看到图中明确定义的变量。在您的示例中,w_sub未在计算中明确使用,b因此不是计算图的一部分。

使用带有以下代码的 theano 打印库,您可以在此 图形可视化中看到 w_sub确实不是 b 图形的一部分。

import theano
import theano.tensor as T
import numpy
import theano.d3viz as d3v

a = T.fvector('a')
w = theano.shared(numpy.array([1, 2, 3, 4], dtype=theano.config.floatX))
w_sub = w[1]
b = T.sum(a * w)

o = b, w_sub

d3v.d3viz(o, 'b.html')

要解决此问题,您需要w_sub在计算中显式使用b.

然后您将能够计算bwrt的梯度w_sub并更新共享变量的值,如下例所示:

import theano
import theano.tensor as T
import numpy


a = T.fvector('a')
w = theano.shared(numpy.array([1, 2, 3, 4], dtype=theano.config.floatX))
w_sub = w[1]
b = T.sum(a * w_sub)
grad = T.grad(b, w_sub)
updates = [(w, T.inc_subtensor(w_sub, -0.1*grad))]

f = theano.function([a], b, updates=updates, allow_input_downcast=True)

f(numpy.arange(10))
于 2016-05-26T16:30:45.730 回答