gpt4 book ai didi

python - theano的扫描功能是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:50 26 4
gpt4 key购买 nike

看看这段代码:

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

x = T.dvector('x')
y = T.dvector('y')

def fun(x,a):
return x+a

results, updates = theano.scan(fn=fun,sequences=dict(input=x), outputs_info=dict(initial=y, taps=[-3]))

h = [10.,20,30,40,50,60,70]
f = theano.function([x, y], results)
g = theano.function([y], y)

print(f([1],h))

我已经将outputs_info'taps更改为-2、-3等,但代码的结果是相同的[11.0],我无法理解。有人可以解释一下吗?

另一个问题。

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

x = T.dvector('x')
y = T.dvector('y')

def fun(x,a,b):
return x+a+b

results, updates = theano.scan(fn=fun,sequences=dict(input=x), outputs_info=dict(initial=y, taps=[-5,-3]))

h = [10.,20,30,40,50,60,70]
f = theano.function([x, y], results)
g = theano.function([y], y)

print(f([1,2,3,4],h))

输出是[41,62,83,85],85是怎么来的?

最佳答案

考虑代码的这种变化:

x = T.dvector('x')
y = T.dvector('y')

def fun(x,a,b):
return x+b

results, updates = theano.scan(
fn=fun,
sequences=dict(input=x),
outputs_info=dict(initial=y, taps=[-5,-3])
)

h = [10.,20,30,40,50,60,70]
f = theano.function([x, y], results)
g = theano.function([y], y)

print(f([1],h))

您的结果将为 31。

  • 将拍子更改为 [-5, -2],结果将更改为 41。
  • 将点击次数更改为 [-4, -3],结果将更改为 21。

这演示了事情是如何工作的:

  1. tap 中最大的负数被视为 h[0]
  2. 所有其他点击都与之偏移

因此,当点击次数为 [-5,-2] 时,有趣的输入 ab 分别 = 10 和 40。

更新新问题

taps 实际上表示函数在时间t 取决于函数在时间t - taps 的输出。

例如,斐波那契数列是由函数定义的

f1

以下是如何使用 theano.scan 实现斐波那契数列:

x = T.ivector('x')
y = T.ivector('y')

def fibonacci(x,a,b):
return a+b

results, _ = theano.scan(
fn=fibonacci,
sequences=dict(input=x),
outputs_info=dict(initial=y, taps=[-2,-1])
)

h = [1,1]
f = theano.function([x, y], results)

print(np.append(h, f(range(10),h)))

但是,theano.scan 有一个问题。如果函数依赖于先前的输出,那么您使用什么作为第一次迭代的先前输出?

答案是初始输入,在您的情况下为h。但在您的情况下 h 比您需要的长度长,您只需要它是 5 个元素长(因为在您的情况下最大的抽头是 -5 )。使用 h 所需的 5 个元素后,您的函数将切换到函数的实际输出。

以下是代码中所发生情况的简化跟踪:

  1. 输出[0] = x[0] + h[0] + h[2] = 41
  2. 输出[1] = x[1] + h[1] + h[3] = 62
  3. 输出[2] = x[2] + h[2] + h[4] = 83
  4. 输出[3] = x[3] + h[3] + 输出[0] = 85

您会看到,在时间 = 4 时,我们有时间 4-3 的函数输出,该输出为 41。既然我们有该输出,我们就需要使用它,因为该函数已定义与使用先前的输出一样。所以我们忽略 h 的其余部分。

关于python - theano的扫描功能是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42766487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com