Ответ 1
Рассмотрим следующие четыре варианта (этот код может быть выполнен для наблюдения различий) и анализ ниже.
import theano
def v1a():
a = theano.shared(1)
outputs, updates = theano.scan(lambda x: x + 1, outputs_info=a, n_steps=10)
f = theano.function([], outputs=outputs)
print f(), a.get_value()
def v1b():
a = theano.shared(1)
outputs, updates = theano.scan(lambda x: x + 1, outputs_info=a, n_steps=10)
f = theano.function([], outputs=outputs, updates=updates)
print f(), a.get_value()
def v2a():
a = theano.shared(1)
outputs, updates = theano.scan(lambda: {a: a + 1}, n_steps=10)
f = theano.function([], outputs=outputs)
print f(), a.get_value()
def v2b():
a = theano.shared(1)
outputs, updates = theano.scan(lambda: {a: a + 1}, n_steps=10)
f = theano.function([], outputs=outputs, updates=updates)
print f(), a.get_value()
def main():
v1a()
v1b()
v2a()
v2b()
main()
Выход этого кода
[ 2 3 4 5 6 7 8 9 10 11] 1
[ 2 3 4 5 6 7 8 9 10 11] 1
[] 1
[] 11
В вариантах v1x
используется lambda x: x + 1
. результат лямбда-функции - это символическая переменная, значение которой больше 1. Имя параметра функции лямбда было изменено, чтобы избежать затенения имени общей переменной. В этих вариантах общая переменная не используется или каким-либо образом не обрабатывается сканированием, кроме использования ее в качестве начального значения повторяющейся символической переменной, увеличиваемой с помощью функции шага сканирования.
В вариациях v2x
используется lambda {a: a + 1}
. Результатом лямбда-функции является словарь, в котором объясняется, как обновить общую переменную a
.
updates
из вариаций v1x
пуст, потому что мы не вернули словарь из функции шага, определяющей любые обновления общих переменных. Вариант outputs
из v2x
пуст, потому что мы не предоставили никакого символьного вывода функции шага. updates
используется только в том случае, если функция шага возвращает словарь выражения с расширением общей переменной (как в v2x
), а outputs
используется только в том случае, если функция шага возвращает выход символьной переменной (как в v1x
).
Когда словарь возвращается, он не будет иметь никакого эффекта, если не указан theano.function
. Обратите внимание, что общая переменная не обновлена в v2a
, но она обновлена в v2b
.