如何更改theano.scan()中给出的函数的输入?

时间:2016-11-29 22:59:36

标签: theano theano.scan

我对theano.scan()感到困惑。我已经阅读了官方文档,但我仍然觉得我的知识有限。我想更改theano.scan中给出的函数的输入。例如,我有以下代码。

def forward_prop_step(x_t, s_t1_prev, s_t2_prev):
    # i have my code here

[o, s, s2], updates = theano.scan(
            forward_prop_step,
            sequences=x,
            truncate_gradient=self.bptt_truncate,
            outputs_info=[None, 
                          dict(initial=T.zeros(self.hidden_dim)),
                          dict(initial=T.zeros(self.hidden_dim))])

因此,此处theano.scan会在序列x上运行。据我所知,forward_prop_stepx_t完成序列theano.scanx如何获取第二个和第三个参数时获得输入forward_prop_steptheano.scanoutputs_info的第2和第3个值获得第2和第3个参数吗?

如果我想修改上面的代码,并希望再给一个参数x2作为theano.scan的序列,我应该如何修改代码?我希望theano.scan运行两个序列xx2,并将其值作为{{1}的前两个参数(xx2) }} 方法。例如,forward_prop_step的原型将是:

forward_prop_step

如何在def forward_prop_step(x_t, x_f, s_t1_prev, s_t2_prev): # i have my code here 上更改上述代码,同时将theano.scanx作为序列?任何人都可以简单解释如何更改x2赋予的函数的参数以及带示例的返回值?

其他几个问题

(1)如果我提供theano.scan参数以及n_steps参数,sequences如何执行?那么theano.scan是否像嵌套(两个)for循环那样工作?

(2)参数theano.scannon_sequences函数参数中的sequences有何不同?

(3)theano.scan是否为序列参数的每个元素调用提供的函数?如果是,那么当我在theano.scan函数内写一个print语句时,forward_prop_step语句只执行一次虽然函数内部的计算执行了几次(遍历整个序列) )。 print如何反复调用提供给它的方法?

1 个答案:

答案 0 :(得分:2)

theano.scanoutputs_info的第2和第3个值获得第2和第3个参数吗?

- >是的,如果outputs_info的元素不是None,则表示它是一个循环输出,因此必须传递给step函数。

如果我想修改上面的代码,并希望再给x2一个参数theano.scan,我应该如何修改代码?

- >您只需要将x2包含在序列列表中

[o, s, s2], updates = theano.scan(
        forward_prop_step,
        sequences=[x, x2],
        truncate_gradient=self.bptt_truncate,
        outputs_info=[None, 
                      dict(initial=T.zeros(self.hidden_dim)),
                      dict(initial=T.zeros(self.hidden_dim))])

参数在step函数中的显示顺序为({1}},sequencesoutputs_info(只有在{{{ 1}})。

(1)如果我给n_steps参数和sequences参数,那么theano.scan如何执行?那么theano.scan就像嵌套(两个)for循环一样工作吗?

如果提供non_sequencesscan将只迭代这些迭代次数。如果要迭代张量,其第一维具有n_steps个元素且scan10,则扫描将仅迭代该张量的前4个“元素”。它不会像嵌套循环一样工作。

(2)参数non_sequences与theano.scan函数参数中的序列有何不同?

n_steps未对

4进行迭代,因为它们在non_sequences函数中使用,所以只提及它们,显然scan可以找出它们在它自己,因此它们只是可选的,不是强制性的(尽管推荐)。相反,step指定变量scan应该在循环时迭代。

(3)sequences是否为序列参数的每个元素调用提供的函数?如果是,那么当我在scan函数内写一个theano.scan语句时,print语句只执行一次虽然函数内部的计算执行了几次(遍历整个序列) )。 forward_prop_step如何反复调用提供给它的方法?

print一次迭代theano.scan中每个元素的第一维,并在每次迭代中调用theano.scan函数。如果要在sequences[]内打印中间计算,则应使用step(有关详细信息,请查看this链接)。 scan语句只执行一次的原因是因为Theano的工作方式是它在扫描代码时构建计算图,然后只用相应的值执行此计算图,python的theano.printing.Print不能作为theano的计算图的一部分,因此你只看到它一次。

我建议您深入了解documentationthis教程。