Python theano scan:如何以占位符提要作为输入输出\u信息

Python theano scan:如何以占位符提要作为输入输出\u信息,python,theano,Python,Theano,我对theano中扫描的输出信息感到困惑。下面是计算**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_

我对theano中扫描的输出信息感到困惑。下面是计算**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\u info=[None,T.ones\u like(A),None]或outpus\u info=[T.ones\u like(A),None,None]时,仍然得到相同的结果。 像(A)这样的T.ones将作为内部fct中先验结果的首字母,因此我可以假设theano将找到一个not None作为先验结果的首字母吗

theano如何在输出信息中选择首字母作为输入

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,这意味着内部_fct的第二个输出不是重复的,但是
print(功率范围(10),2))
显示
B2
结果相同

outputs_info
的工作原理与所说的一样

特别是,

输出信息是无变量或字典的列表 描述循环计算的输出的初始状态

以及

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

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

对于
outputs\u info
中的每个值,如果它是
None
,则表示该值不是重复出现的(此位置的输出不会提供给以后的迭代)。非
None
输出_info
值表示该位置的阶跃输出是重复的,提供的值是第一步中传递给阶跃函数的初始值;后续步骤接收上一步骤的输出

因此,
scan
并没有做一些聪明的魔术来自动找出哪个元素包含初始值。在第二个示例中,您只是告诉Theano做一些特定的事情,step函数返回两个非递归值(因此是两个
None
s),然后是一个递归值(因此是第三个位置的初始值)


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

输出信息
的工作原理与所说的一样

特别是,

输出信息是无变量或字典的列表 描述循环计算的输出的初始状态

以及

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

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

对于
outputs\u info
中的每个值,如果它是
None
,则表示该值不是重复出现的(此位置的输出不会提供给以后的迭代)。非None
输出_info
值表示该位置的阶跃输出是重复的,提供的值是第一步中传递给阶跃函数的初始值;后续步骤接收上一步骤的输出

因此,
scan
并没有做一些聪明的魔术来自动找出哪个元素包含初始值。在第二个示例中,您只是告诉Theano做一些特定的事情,step函数返回两个非递归值(因此是两个
None
s),然后是一个递归值(因此是第三个位置的初始值)


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

我仍然有点困惑。如果将内部\u fct的输出更改为
,则返回B、前一个\u结果*B、前一个\u结果*B
,并像往常一样输出\u信息。然后我们可以看到运行
power
result
B2
相同,这意味着
B2
是反复出现的。但是第二个输出信息是None,这意味着
B2
不是重复出现的,有什么我误解的吗?对不起,我不明白。您能否编辑您的问题以包含此附加变体的代码?对不起,我没有说清楚。我通过添加第三个代码块来编辑我的问题。你的第二个