Definieren eines Verlaufs in Bezug auf einen Subtensor in Theano

Ich habe eine konzeptionell einfache Frage zu Theano, konnte aber keine Antwort finden (ich muss gestehen, dass ich nicht wirklich verstehe, wie gemeinsam genutzte Variablen in Theano funktionieren, obwohl die Tutorials viele Stunden dauern).

Ich versuche, ein "Dekonvolutionsnetzwerk" zu implementieren. Insbesondere habe ich einen 3-Tensor von Eingaben (jede Eingabe ist ein 2D-Bild) und einen 4-Tensor von Codes; für die i-ten Eingabecodes stellt [i] einen Satz von Codewörtern dar, die zusammen für die Eingabe i codieren.

Ich hatte große Probleme herauszufinden, wie man mit den Codewörtern einen Gefälle-Abstieg durchführt. Hier sind die relevanten Teile meines Codes:

idx = T.lscalar()
pre_loss_conv = conv2d(input = codes[idx].dimshuffle('x', 0, 1,2),
                       filters = dicts.dimshuffle('x', 0,1, 2),
                       border_mode = 'valid')
loss_conv = pre_loss_conv.reshape((pre_loss_conv.shape[2], pre_loss_conv.shape[3]))
loss_in = inputs[idx]
loss = T.sum(1./2.*(loss_in - loss_conv)**2) 

del_codes = T.grad(loss, codes[idx])
delc_fn = function([idx], del_codes)
train_codes = function([input_index], loss, updates = [
    [codes, T.set_subtensor(codes[input_index], codes[input_index] - 
                            learning_rate*del_codes[input_index])     ]])

(hier sind Codes und Dicts gemeinsame Tensorvariablen). Theano ist damit unzufrieden, insbesondere mit der Definition

del_codes = T.grad(loss, codes[idx])

Die Fehlermeldung, die ich erhalte, ist:Die Methode 'theano.gradient.DisconnectedInputError: grad' wurde aufgefordert, den Gradienten in Bezug auf eine Variable zu berechnen, die nicht Teil des Berechnungsdiagramms der Kosten ist oder nur von einem nicht differenzierbaren Operator verwendet wird: Subtensor {int64} .0

Ich vermute, dass es eine symbolische Variable anstelle von Codes [idx] will; aber dann bin ich nicht sicher, wie ich alles verbinden kann, um den beabsichtigten Effekt zu erzielen. Ich schätze, ich muss die letzte Zeile in so etwas wie ändern

learning_rate*del_codes)     ]])

Kann mir jemand Hinweise geben, wie man diese Funktion richtig definiert? Ich denke, ich vermisse wahrscheinlich etwas Grundlegendes an der Arbeit mit Theano, aber ich bin mir nicht sicher, was.

Danke im Voraus!

-Justin

Update: Kyles Vorschlag hat sehr gut funktioniert. Hier ist der spezifische Code, den ich verwendet habe

current_codes = T.tensor3('current_codes')
current_codes = codes[input_index]
pre_loss_conv = conv2d(input = current_codes.dimshuffle('x', 0, 1,2),
                       filters = dicts.dimshuffle('x', 0,1, 2),
                       border_mode = 'valid')
loss_conv = pre_loss_conv.reshape((pre_loss_conv.shape[2], pre_loss_conv.shape[3]))
loss_in = inputs[input_index]
loss = T.sum(1./2.*(loss_in - loss_conv)**2)  

del_codes = T.grad(loss, current_codes)
train_codes = function([input_index], loss)
train_dicts = theano.function([input_index], loss, updates = [[dicts, dicts - learning_rate*del_dicts]])
codes_update = ( codes, T.set_subtensor(codes[input_index], codes[input_index] - learning_rate*del_codes) )
codes_update_fn = function([input_index], updates = [codes_update])

for i in xrange(num_inputs):
     current_loss = train_codes(i)
     codes_update_fn(i)