2016-11-29 7 views
0

У меня путают около theano.scan(). Я прочитал официальную документацию, но я все еще чувствую, что мои знания ограничены. Я хочу изменить входы функции, указанной в theano.scan. Например, у меня есть следующий код.Как изменить ввод функции, заданной в anano.scan()?

def forward_prop_step(x_t, s_t1_prev, s_t2_prev): 
    # i have my code here 

[o, s, s2], updates = theano.scan(
      forward_prop_step, 
      sequences=x, 
      truncate_gradient=self.bptt_truncate, 
      outputs_info=[None, 
          dict(initial=T.zeros(self.hidden_dim)), 
          dict(initial=T.zeros(self.hidden_dim))]) 

Итак, здесь theano.scan пробегает последовательность x. Насколько я понял, forward_prop_step получает вход x_t, когда theano.scan проходит через последовательность x, но как forward_prop_step получает второй и третий параметр? Is theano.scan получение 2-го и 3-го параметров от 2-го и 3-го значений outputs_info?

Если я хочу изменить приведенный выше код и хочу дать еще один параметр x2 в качестве последовательности theano.scan, как мне изменить код? Я хочу, чтобы theano.scan выполнял две последовательности x и x2 и дал свои значения в качестве первых двух параметров (x и x2) метода forward_prop_step. Например, прототип forward_prop_step будет:

def forward_prop_step(x_t, x_f, s_t1_prev, s_t2_prev): 
    # i have my code here 

Как я могу изменить приведенный выше код на theano.scan дать как x и x2 как последовательность? Может ли кто-нибудь кратко объяснить, как я могу изменить параметры функций, заданных theano.scan, а также возвращаемые значения с примерами?

Немногие другие вопросы:

(1) Если я даю n_steps параметр вместе с параметром sequences Как theano.scan Выполняет? Есть theano.scan, тогда работает как вложенный (два) для цикла?

(2) Как параметр non_sequences отличается от sequences в theano.scan параметр функции?

(3) Выполняет ли theano.scan функцию, предоставленную для каждого элемента параметра последовательности? Если это так, то когда я пишу оператор print внутри функции forward_prop_step, оператор print выполняется только один раз, хотя вычисление внутри функции выполняется несколько раз (проходит через всю последовательность). Как theano.scan неоднократно называет метод, который ему предоставляется?

ответ

2

Действительно ли theano.scan получает 2-й и 3-й параметры от 2-го и 3-го значений outputs_info?

-> Да, если элемент outputs_info не является None, это означает, что он является рекуррентным выходом и поэтому должен быть передан функции step.

Если я хочу изменить приведенный выше код и хочу дать еще один параметр x2 в качестве последовательности до theano.scan, как мне изменить код?

-> Вам просто нужно включить x2 в список последовательностей

[o, s, s2], updates = theano.scan(
     forward_prop_step, 
     sequences=[x, x2], 
     truncate_gradient=self.bptt_truncate, 
     outputs_info=[None, 
         dict(initial=T.zeros(self.hidden_dim)), 
         dict(initial=T.zeros(self.hidden_dim))]) 

Порядок, в котором параметры отображаются в функции step является (элементы): sequences, outputs_info и non_sequences (только если они указанном в scan).

(1) Если я даю параметр n_steps вместе с параметром sequence, как выполняется anano.scan? Является ли anano.scan тогда работает как вложенный (два) цикл?

Если n_steps предоставляется scan будет выполнять только итерацию для такого количества итераций. Если вы выполняете итерацию над тензором, у 1-го измерения которого есть 10 элементов, а n_steps - 4, то сканирование будет перебирать только первые 4 'элемента' этого тензора. Он не будет работать как вложенный цикл.

(2) Как параметр non_sequences отличается от параметров в параметре функции anano.scan?

non_sequences не итерация на по scan, они упоминаются лишь для ясности кода, поскольку они используются в функции step, очевидно scan может выяснить их по себе и, следовательно, они являются только по желанию, не обязательно (хотя рекомендуется). Противоположно, sequences указать переменные scan следует перебирать по мере его цикла.

(3) Выполняет ли theano.scan функцию, предоставленную для каждого элемента параметра последовательности? Если это так, то когда я пишу оператор print внутри функции forward_prop_step, оператор print выполняется только один раз, хотя вычисление внутри функции выполняется несколько раз (проходит через всю последовательность). Как theano.scan неоднократно называет метод, который ему предоставляется?

theano.scan выполняет итерацию по первому размеру каждого элемента в пределах sequences[] сразу, и в течение каждой итерации он вызывает функцию step. Если вы хотите распечатать промежуточные вычисления внутри scan, вы должны использовать theano.printing.Print (подробнее см. Ссылку this). Причина, по которой оператор print выполняется только один раз, заключается в том, что, как работает Theano, он строит граф вычислений при проверке кода, а затем только этот граф вычислений выполняется с соответствующими значениями, python print не может быть частью сделанной части графика вычислений anano и, следовательно, вы видите его только один раз.

Я бы предложил более подробно изучить documentation и this учебник.

+0

поблагодарить брата за ваш краткий ответ, я действительно ценю его. Я добавил еще один вопрос (3-й вопрос) на мой пост, можете ли вы ответить на него тоже? Я прочитал документацию, но не мог понять, как anano.scan итеративно вызывает функцию? –

+0

спасибо тонну, брат! –

+0

Я рад, это помогло – uyaseen