我正在拼命地理解水龙头的论点 在theano.scan功能。不幸的是我 无法提出具体问题。
我只是不明白“水龙头”机制。 好吧,我还好。我知道序列的顺序 传递给函数,但我不知道 意思。例如(我从中借用了这段代码 另一个问题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文件 似乎没有详细说明水龙头的论点...... 所以希望你们其中一个人会。
THX
答案 0 :(得分:8)
为了更好地理解taps
的使用,您应首先了解scan
如何完全使用outputs_info
参数以及如何为其提供的值(initial
)改变结果的性质。
scan
希望您提供此操作所期望的输出类型(除非您当前没有提供任何初始值,只需提及None
,在这种情况下它将启动第一个舍入{step
}并且输出不会作为参数传递给连续轮次中的fn
。
因此,scan
用于对提供的sequences
进行迭代缩减。这意味着,在step
n (并且taps
或sequences
未指定outputs_info
)时,给定的fn
将应用于每个sequences
的 n 元素以及前一个( n-1 th)生成的输出{{1 }}。因此,step
的{{1}}默认值为taps
,而sequences
的默认值为0
。
另一种看待它的方法是将所有序列都考虑在它们各自的第一维上的切片组成。因此,对于特定步骤,将outputs_info
的当前切片和前一步骤的输出切片传递给-1
,并将计算的输出作为新切片添加到结果中然后用于下一个sequence(s)
。显然,每个输出切片将具有相同的形状。如果您提供初始切片作为fn
的一部分,那么它也应该具有与step
的应用程序生成的切片相同的形状。在您的示例中,如果outputs_info
,则fn
作为第一个切片,并将其用作第一个output_info=[dict(initial=x0)]
作为参数[2, 3]
到step
。< / p>
但通常在信号处理(以及其他地方),您需要的不仅仅是最后的数据点作为因果信息。在这里,我用时间来表示a1
。无论如何,这是addf
有用的地方,有助于准确指出steps
和taps
中哪些数据点必须用于当前sequences
。在您的示例中,这意味着对于当前results
,应将第三个最后一个输出传递给step
。
这就是为step
描述fn
时需要小心的地方。因为扫描将首先将initial
值拆分为沿第一维度的切片。 然后,这组切片中的第一个切片将被视为最早切片(在您的示例中为第3个)计算第一个outputs_info
的输出所需的。
让我们在您的示例中假设initial
和step
。在这种情况下,扫描会将输入拆分为切片,并使用第一个切片(此处为值2)作为参数taps=[-2]
到input = [2, 3]
。结果值4将被添加到输出中,并且对于下一步骤,切片将包括[2,3,4],其中值3在倒数第二个(-2)上。等等。但是,对于a1
和addf
,会丢失一个值,就像说您曾经在时间(t-3)和(t-2)收集了值但没有收集值在(t-1)。
因此,如果您认为输出具有某种形状,并且您需要多次输出超过-1,那么taps=[-3]
的值应该是所需输出形状的元素列表和 完全检索最早切片所需的元素数量。
TLDR:
在您的示例中,如果您希望获得2d向量作为每个input
的结果并使用initial
,那么step
应该是3个这样的2d向量的列表。如果您想获得单值结果,那么taps=[-3]
应该是一个包含3个整数的列表。在这种情况下,具有2个整数的列表没有意义。只有input
为-2或-1或input
才有意义。