theano-scan:outputs_info如何将占位符Feed作为输入

时间:2015-12-04 01:52:33

标签: python theano

我对theano的扫描的outputs_info感到困惑。下面是计算A ** k:

的扫描示例
k = T.iscalar("k")
A = T.vector("A")
def inner_fct(prior_result, B):
    return prior_result * B
# Symbolic description of the result
result, updates = theano.scan(fn=inner_fct,
                            outputs_info=T.ones_like(A),
                            non_sequences=A, n_steps=k)
# Scan has provided us with A ** 1 through A ** k.  Keep only the last
# value. Scan notices this and does not waste memory saving them.
final_result = result[-1]
power = theano.function(inputs=[A, k], outputs=final_result,
                      updates=updates)
print(power(range(10), 2))

我做了一点改动如下:

k = T.iscalar("k")
A = T.vector("A")
def inner_fct(prior_result, B):
    return B, B, prior_result * B   #!! change return of inner_fct
#!! change scan as below
[B1, B2, result], updates = theano.scan(fn=inner_fct,
                            outputs_info=[None, None, T.ones_like(A)],
                            non_sequences=A, n_steps=k)
final_result = result[-1]
power = theano.function(inputs=[A, k], outputs=final_result,
                      updates=updates)
print(power(range(10), 2))

它仍然得到与原始相同的结果。当我改变outpus_info = [None,T.ones_like(A),None]或ouputs_info = [T.ones_like(A),None,None]时,它仍会得到相同的结果。 T.ones_like(A)将作为inner_fct中prior_result的首字母,所以我可以假设theano会找到一个非None作为prior_result的首字母吗?

theano究竟如何选择outputs_info中的首字母作为输入?

k = T.iscalar("k")
A = T.vector("A")
def inner_fct(prior_result, B):
    return B, prior_result*B, prior_result * B   #!! change return of inner_fct
#!! change scan as below
[B1, B2, result], updates = theano.scan(fn=inner_fct,
                            outputs_info=[None, None, T.ones_like(A)],
                            non_sequences=A, n_steps=k)
power = theano.function(inputs=[A, k], outputs=[B2,result],
                      updates=updates)
print(power(range(10), 2))

outputs_info中的第二个参数是None,这意味着inner_fct的第二个输出不是循环的,但print(power(range(10), 2))表示B2result相同。

1 个答案:

答案 0 :(得分:4)

outputs_info就像the documentation说的那样有效。

特别是

  

outputs_info是Theano变量或词典的列表   描述了经常计算的输出的初始状态。

  

如果提供None而不是变量或空字典扫描   假设您不会对此输出使用任何分接头(例如   例如,如果是地图)

outputs_info列表中的元素数量应与scan步骤函数返回的值的数量相匹配。在第一个示例中,step函数返回单个值,因此outputs_info应该(并且确实)包含单个元素。在第二个示例中,step函数返回三个值,因此outputs_info应该(并且确实)包含三个元素。

对于outputs_info中的每个值,如果它是None,则表示该值不是重复的(此位置的输出不可用于以后的迭代)。非None outputs_info值表示该位置中的步骤输出是重复的,并且提供的值是要在第一个中传递给步进函数的初始值步;后续步骤接收上一步的输出。

所以scan没有做一些聪明的魔术来自动找出哪个元素包含初始值。您只是告诉Theano在第二个示例中执行某些特定操作,step函数返回两个非循环值(因此两个None s)后跟一个循环值(因此第三个位置的初始值)

在第三个例子中(在问题编辑中添加),步骤函数(第三个)仍然只有一个循环输出。 outputs_info值确定哪些输出是重复的,在第三个示例中,只有一个非None outputs_info值。 B2函数输出和result函数输出是相同的,因为它们具有相同的计算表达式:prior_result*B。迭代这两个值中的哪一个并不重要,它们始终保持相同。