Определение градиента относительно субтенора в Theano

У меня есть простой концептуальный вопрос о Theano, но я так и не смог найти ответ (сразу признаюсь, что не совсем понимаю, как работают общие переменные в Theano, несмотря на то, что я много часов занимался с учебниками).

Я пытаюсь реализовать "деконволюционную сеть"; в частности, у меня есть 3-тензорные входы (каждый вход представляет собой 2D-изображение) и 4-тензорные коды; для i-х входных кодов [i] представляет собой набор кодовых слов, которые вместе кодируют для ввода i.

У меня было много проблем, чтобы понять, как сделать градиентный спуск на кодовых словах. Вот соответствующие части моего кода:

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])     ]])

(здесь коды и слова являются общими тензорными переменными). Theano недоволен этим, особенно с определением

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

Я получаю сообщение об ошибке:theano.gradient.DisconnectedInputError: методу grad было предложено вычислить градиент относительно переменной, которая не является частью вычислительного графа стоимости или используется только недифференцируемым оператором: Subtensor {int64} .0

Я предполагаю, что он хочет символическую переменную вместо кодов [idx]; но тогда я не уверен, как связать все, чтобы получить желаемый эффект. Я думаю, мне нужно изменить последнюю строку на что-то вроде

learning_rate*del_codes)     ]])

Может кто-нибудь дать мне несколько советов о том, как правильно определить эту функцию? Я думаю, что мне, вероятно, не хватает чего-то базового в работе с Theano, но я не уверен, что именно.

Заранее спасибо!

-Джастин

Обновление: предложение Кайла сработало очень хорошо. Вот конкретный код, который я использовал

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)

Ответы на вопрос(1)

Ваш ответ на вопрос