我对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_step
在x_t
完成序列theano.scan
但x
如何获取第二个和第三个参数时获得输入forward_prop_step
? theano.scan
从outputs_info
的第2和第3个值获得第2和第3个参数吗?
如果我想修改上面的代码,并希望再给一个参数x2作为theano.scan
的序列,我应该如何修改代码?我希望theano.scan
运行两个序列x
和x2
,并将其值作为{{1}的前两个参数(x
和x2
) }} 方法。例如,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.scan
和x
作为序列?任何人都可以简单解释如何更改x2
赋予的函数的参数以及带示例的返回值?
其他几个问题:
(1)如果我提供theano.scan
参数以及n_steps
参数,sequences
如何执行?那么theano.scan
是否像嵌套(两个)for循环那样工作?
(2)参数theano.scan
与non_sequences
函数参数中的sequences
有何不同?
(3)theano.scan
是否为序列参数的每个元素调用提供的函数?如果是,那么当我在theano.scan
函数内写一个print
语句时,forward_prop_step
语句只执行一次虽然函数内部的计算执行了几次(遍历整个序列) )。 print
如何反复调用提供给它的方法?
答案 0 :(得分:2)
theano.scan
从outputs_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}},sequences
和outputs_info
(只有在{{{ 1}})。
(1)如果我给n_steps参数和sequences参数,那么theano.scan如何执行?那么theano.scan就像嵌套(两个)for循环一样工作吗?
如果提供non_sequences
,scan
将只迭代这些迭代次数。如果要迭代张量,其第一维具有n_steps
个元素且scan
为10
,则扫描将仅迭代该张量的前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的计算图的一部分,因此你只看到它一次。
我建议您深入了解documentation和this教程。