Python theano.scan 点击参数

Python theano.scan taps argument

我正在拼命地理解 taps 参数 在 theano.scan 函数中。不幸的是我 无法提出具体问题。

我只是不明白"taps"机制。 好吧,我还好。我知道序列的顺序 传递给函数,但我不知道 意义。例如(我从 另一个问题 Python - Theano scan() function):

import numpy as np
import theano
import theano.tensor as T


def addf(a1,a2):
    print(a1)
    print(a2)
    return a1+a2

i = T.iscalar('i')
x0 = T.ivector('x0') 
step= T.iscalar('step')

results, updates = theano.scan(fn=addf,
                   outputs_info=[dict(initial=x0, taps=[-3])],
                   non_sequences=step,
                   n_steps=i)

f=theano.function([x0, step,i],results)

input = [2, 3]

print(f(input, 2, 20))

将抽头设置为 -1 对我来说确实有意义。据我所理解 这与不设置抽头值和整个向量相同 'x0' 正在传递给 addf 函数。然后将添加 x0 使用 "step" 参数(将广播到相同大小的 int 2)。 在下一次迭代中,结果 [4, 5] 将作为输入,依此类推 产生以下输出:

[[ 4  5]
 [ 6  7]
 [ 8  9]
 [10 11]
 [12 13]
 [14 15]
 [16 17]
 [18 19]
 [20 21]
 [22 23]
 [24 25]
 [26 27]
 [28 29]
 [30 31]
 [32 33]
 [34 35]
 [36 37]
 [38 39]
 [40 41]
 [42 43]]

然而,将抽头设置为 -3 会产生以下输出:

[ 5  2  6  7  4  8  9  6 10 11  8 12 13 10 14 15 12 16 17]

我不知道扫描函数是如何创建这个的 输出。为什么现在只是一个列表? "print(a1)" 结果如预期的那样

x0[t-3]

虽然我知道这是a1应该有的值, 我不知道如何解释它。什么是第 t-3 个值 x0? theano 文档 似乎并没有详细说明 taps 参数...... 所以希望你们中的一个人会成为。

感谢

为了更好地理解 taps 的用法,您应该首先理解 scan 如何完全使用 outputs_info 参数以及为它提供的值(initial 到确切地说)改变结果的性质。

scan 期望您提供您希望从该操作中获得的输出类型(当然除非您没有任何初始值可提供并简单地提及 None,在这种情况下它将开始第一轮 {step} 并且输出没有作为参数传递给后续轮中的 fn

因此 scan 用于对提供的 sequences 进行迭代归约。这意味着在 step n(并且没有为 sequencesoutputs_info 指定 taps),给定的 fn 将应用于每个 sequences 的第 n 个元素以及前一个(n-1th)step。因此 sequencestaps 的默认值是 0outputs_info 的默认值是 -1.

另一种看待它的方法是将所有序列视为由横跨其各自第一维的切片组成。因此,对于特定步骤,sequence(s) 的当前切片和上一步的输出切片被传递给 fn 并且计算的输出作为新切片添加到结果中,这将然后用于下一个 step。很明显,每个输出切片都具有相同的形状。如果您提供初始切片作为 outputs_info 的一部分,那么它的形状也应该与 fn 的应用程序产生的形状相同。在您的示例中,如果 output_info=[dict(initial=x0)],它会将 [2, 3] 作为第一个切片并将其用于第一个 step 作为参数 a1addf

但在信号处理(和其他地方)中,您经常需要的不仅仅是最后一个数据点作为因果信息。在这里,我使用时间来表示 steps。无论如何,这是 taps 有用的地方,有助于准确指示 sequencesresults 中的哪些数据点必须用于当前 step。在您的示例中,这意味着对于当前 step,应该将倒数第三个输出传递给 fn

这是您在为 outputs_info 描述 initial 时需要小心的地方。因为 scan 会首先将 initial 值沿着第一个维度分割成片。 然后这组切片中的第一个切片将被视为最早的切片(在您的示例中倒数第 3 个)需要计算第一个 step 的输出.

让我们假设在您的示例中,taps=[-2]input = [2, 3]。在这种情况下,scan 会将输入拆分为多个切片,并使用第一个切片(这里的值为 2)作为参数 a1addf。结果值 4 将被添加到输出中,对于下一步,切片将包括 [2, 3, 4],其中值 3 在倒数第二个 (-2) 抽头上。等等。但是,对于 taps=[-3] 和相同的 input,缺少一个值,这就像说您在时间 (t-3) 和 (t-2) 收集了值但没有收集值在 (t-1).

因此,如果您认为您的输出具有某种形状,并且您需要多次抽头输出超过 -1,那么 initial 的值应该是所需输出形状的元素列表具有恰好个检索最早切片所需的元素。

TLDR: 在你的例子中,如果你想得到二维向量作为每个 step 的结果并且正在使用 taps=[-3],那么 input 应该是 3 个这样的二维向量的列表。如果你想获得单值结果,那么 input 应该是一个包含 3 个整数的列表。在此上下文中,包含 2 个整数的列表根本没有意义。仅当 taps 为 -2 或 -1 或 [-2, -1].

时才有意义