Функция Python – Theano scan ()

Я не могу полностью понять поведение theano.scan ().

Вот пример:

import numpy as np import theano import theano.tensor as T def addf(a1,a2): return a1+a2 i = T.iscalar('i') x0 = T.ivector('x0') step= T.iscalar('step') results, updates = theano.scan(fn=addf, outputs_info=[{'initial':x0, 'taps':[-2]}], non_sequences=step, n_steps=i) f=theano.function([x0,i,step],results) print f([1,1],10,2) 

Вышеприведенный фрагмент печатает следующую последовательность, что вполне разумно:

 [ 3 3 5 5 7 7 9 9 11 11] 

Однако, если я переключу индекс от -2 до -1, т.е.

 outputs_info=[{'initial':x0, 'taps':[-1]}] 

Результат будет:

 [[ 3 3] [ 5 5] [ 7 7] [ 9 9] [11 11] [13 13] [15 15] [17 17] [19 19] [21 21]] 

вместо того, что мне кажется разумным (просто возьмите последнее значение вектора и добавьте 2):

 [ 3 5 7 9 11 13 15 17 19 21] 

Любая помощь приветствуется.

Благодаря!

  • Почему флаг FloatX влияет на использование GPU в Theano?
  • ImportError: нет модуля с именем downsample
  • Что такое тип данных для пакета глубокого обучения Python Keras?
  • Как получить значение из переменной тензора anano, поддерживаемой общей переменной?
  • Установка анано
  • theano - значение печати TensorVariable
  • ПРЕДУПРЕЖДЕНИЕ (theano.sandbox.cuda): CUDA установлен, но устройство gpu недоступно (ошибка: cuda недоступна)
  • pdist для тензора аана
  • One Solution collect form web for “Функция Python – Theano scan ()”

    Когда вы используете taps = [- 1], сканирование предполагает, что информация в выходной информации используется как есть. Это означает, что функция addf будет вызываться с вектором и non_sequence в качестве входных данных. Если вы конвертируете x0 в скаляр, он будет работать так, как вы ожидаете:

     import numpy as np import theano import theano.tensor as T def addf(a1,a2): print a1.type print a2.type return a1+a2 i = T.iscalar('i') x0 = T.iscalar('x0') step= T.iscalar('step') results, updates = theano.scan(fn=addf, outputs_info=[{'initial':x0, 'taps':[-1]}], non_sequences=step, n_steps=i) f=theano.function([x0,i,step],results) print f(1,10,2) 

    Это даст следующий результат:

     TensorType(int32, scalar) TensorType(int32, scalar) [ 3 5 7 9 11 13 15 17 19 21] 

    В вашем случае, как и addf (вектор, скаляр), он передает элементовое значение.

    Объясняется иначе, если краны [-1], x0 будет передаваться «как есть» во внутреннюю функцию. Если краны содержат что-то еще, то, что передается внутренней функции, будет иметь 1 размер меньше, чем x0, так как x0 должен предоставить много начальных шагов (-2 и -1).

    Python - лучший язык программирования в мире.