【问题标题】:Python theano.scan taps argumentPython theano.scan 点击参数
【发布时间】:2015-10-15 17:21:11
【问题描述】:

我正在拼命地理解 taps 参数 在 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 th 值是多少 x0? Theano 文档 关于 taps 论点似乎并不十分详细...... 所以希望你们中的一个人会成为。

谢谢

【问题讨论】:

  • 如果您查看链接的问题的答案,您会看到@nouiz 已解释将outputs_info 中除-1 之外的任何内容传递给taps 将导致值通过比初始值少一维。我相信x0t0tm3 值将默认为您传递的dict() 参数中指定的初始值,因此x0 的初始值,尽管我不完全确定这个约定.

标签: python theano


【解决方案1】:

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

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

所以scan 用于对提供的sequences 进行迭代缩减。这意味着在step n(并且没有为sequencesoutputs_info 指定taps),给定的fn 将应用于n每个sequences 的第 em> 个元素以及前一个(n-1 个)step 生成的输出。因此taps 的默认值sequences0outputs_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 时需要小心的地方。因为扫描会首先将initial 值沿第一个维度拆分为多个切片。 那么这组切片中的第一个切片将被视为最早的切片(在您的示例中为倒数第三个)需要计算第一个 step 的输出。。 p>

假设在您的示例中,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: 在您的示例中,如果您想获得 2d 向量作为每个 step 的结果并使用 taps=[-3],那么 input 应该是 3 个这样的 2d 向量的列表。如果你想得到单值结果,那么input 应该是一个包含 3 个整数的列表。在这种情况下,包含 2 个整数的列表根本没有意义。只有当taps 是-2 或-1 或[-2, -1] 时才有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多