2016-03-24 15 views
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, например, ш [1], но я не хочу, чтобы явно выписать б в функция w_sub. Несмотря на то, что я прошел через http://deeplearning.net/software/theano/tutorial/faq_tutorial.html и другие связанные с этим вопросы, я не могу его решить.

Это просто, чтобы показать вам мою проблему. Вообще-то, что я действительно хочу сделать, это редкая свертка с лазанью. Нулевые записи в весовой матрице не нуждаются в обновлении, и поэтому нет необходимости вычислять градиент для этих записей w.

С уважением, благодарю вас заранее!

Йерун

PS: Теперь это полное сообщение об ошибке:

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] 

ответ

2

Когда Theano составляет график, он только видит переменные, как четко определены в графике. В вашем примере w_sub явно не используется при вычислении b и поэтому не является частью графика вычислений.

Используя библиотеку Anano для печати со следующим кодом, вы можете увидеть на этом graph vizualization, что действительно 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.

Тогда вы сможете вычислить градиенты b WRT 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)) 
+0

Хорошее объяснение того, что происходит. Спасибо. –