我对无扫描机制有点困惑,这里有一个简单的代码片段来计算^k
import numpy
import theano
import theano.tensor as T
def recurrence(pre_output, a):
print("test")
return pre_output*a
x = T.ivector('x')
o, updates = theano.scan(
fn = recurrence,
outputs_info = T.ones_like(x),
non_sequences = x,
n_steps = 5
)
fun = theano.function([x], o)
print(fun([1,2,3]))
我在scan函数中设置print(“test”),因为n\u steps是5,所以递归函数应该被调用5次,我的第一个想法是“test”字符串应该被打印5次。你知道吗
但是,如下面的输出所示,“test”字符串只输出1次。你知道吗
test
[[ 1 2 3]
[ 1 4 9]
[ 1 8 27]
[ 1 16 81]
[ 1 32 243]]
所以,有点困惑,既然递归函数被多次调用(n\u步),为什么“test”字符串只输出一次?你知道吗
任何帮助都将不胜感激。你知道吗
谢谢
我不会做得太深。你知道吗
theano的机制是,它为计算过程建立一个图形,并根据图形以一种我们不必关心的复杂方式进行计算。这就是为什么theano可以计算梯度,因为它模拟了之前的计算过程。你知道吗
这就是问题的关键无扫描(fn=xxx,),通过给scan你的fn,你告诉theano如何构建图形而不是在这个循环中做什么。你知道吗
Theano将根据您的fn构建图形,但它将以自己的方式计算它,而不是使用您的代码。你知道吗
所以结论是:当scan试图构建图形时,您的代码只使用了一次,然后它就被丢弃了,这就解释了为什么您的“测试”只出现一次。你知道吗
我希望这有帮助。你知道吗
这里有一个演示我创建来解释,如果你喜欢你可以尝试阅读它。我来自中国,希望我糟糕的英语不会让你感到不安。你知道吗
https://gist.github.com/NickQianFeng/9b91f2ecaa4f7e5ddb89d1b50cac1576
相关问题 更多 >
编程相关推荐