Python Theano scan()函数

2024-06-11 21:45:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法完全理解sano.scan()的行为。

下面是一个例子:

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


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

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

results, updates = theano.scan(fn=addf,
                   outputs_info=[{'initial':x0, 'taps':[-2]}],
                   non_sequences=step,
                   n_steps=i)

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

print f([1,1],10,2)

上面的片段打印以下序列,这是完全合理的:

[ 3  3  5  5  7  7  9  9 11 11]

但是,如果我将抽头索引从-2切换到-1,即

outputs_info=[{'initial':x0, 'taps':[-1]}]

结果变成:

[[ 3  3]
 [ 5  5]
 [ 7  7]
 [ 9  9]
 [11 11]
 [13 13]
 [15 15]
 [17 17]
 [19 19]
 [21 21]]

而不是我认为合理的(取向量的最后一个值并加2):

[ 3  5  7  9 11 13 15 17 19 21]

任何帮助都将不胜感激。

谢谢!


Tags: importinfoa2scana1assteptheano
1条回答
网友
1楼 · 发布于 2024-06-11 21:45:08

当使用taps=[-1]时,scan假设输出信息中的信息按原样使用。这意味着addf函数将以向量和非u序列作为输入来调用。如果将x0转换为标量,它将按预期工作:

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


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

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

results, updates = theano.scan(fn=addf,
                   outputs_info=[{'initial':x0, 'taps':[-1]}],
                   non_sequences=step,
                   n_steps=i)

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

print f(1,10,2)

这将产生以下输出:

TensorType(int32, scalar)
TensorType(int32, scalar)
[ 3  5  7  9 11 13 15 17 19 21]

在您的例子中,就像它做addf(vector,scalar)一样,它广播elemwise值。

另一种解释是,如果taps是[-1],x0将按原样传递给内部函数。如果taps包含任何其他内容,传递给内部函数的内容将比x0小1维,因为x0必须提供许多初始步骤值(-2和-1)。

相关问题 更多 >