我正在尝试在theano中实现扫描循环,给定张量将使用输入的“运动切片”。它实际上不一定是运动切片,它可以是经过预处理的张量,也可以是代表该运动切片的另一个张量。
本质上:
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
|-------| (first iteration)
|-------| (second iteration)
|-------| (third iteration)
...
...
...
|-------| (last iteration)
其中
|-------|
是每次迭代的输入。我试图找出最有效的方法,也许使用某种形式的引用或操纵步幅,但是即使是纯粹的numpy,我也没有设法使某些事情起作用。
我发现了一个可能的解决方案,可以找到here,但是我无法弄清楚如何使用跨步,并且我看不到将其用于theano的方法。
最佳答案
您可以构建一个包含每个时间步的切片起始索引的向量,然后调用Scan并将该向量作为序列,将原始向量作为非序列。然后,在“扫描”内部,您可以在每次迭代中获取所需的切片。
我提供了一个示例,其中还将切片的大小作为符号输入,以防您要将其从Theano函数的一次调用更改为下一次调用:
import theano
import theano.tensor as T
# Input variables
x = T.vector("x")
slice_size = T.iscalar("slice_size")
def step(idx, vect, length):
# From the idx of the start of the slice, the vector and the length of
# the slice, obtain the desired slice.
my_slice = vect[idx:idx + length]
# Do something with the slice here. I don't know what you want to do
# to I'll just return the slice itself.
output = my_slice
return output
# Make a vector containing the start idx of every slice
slice_start_indices = T.arange(x.shape[0] - slice_size + 1)
out, updates = theano.scan(fn=step,
sequences=[slice_start_indices],
non_sequences=[x, slice_size])
fct = theano.function([x, slice_size], out)
使用参数运行该函数将产生输出:
print fct(range(17), 5)
[[ 0. 1. 2. 3. 4.]
[ 1. 2. 3. 4. 5.]
[ 2. 3. 4. 5. 6.]
[ 3. 4. 5. 6. 7.]
[ 4. 5. 6. 7. 8.]
[ 5. 6. 7. 8. 9.]
[ 6. 7. 8. 9. 10.]
[ 7. 8. 9. 10. 11.]
[ 8. 9. 10. 11. 12.]
[ 9. 10. 11. 12. 13.]
[ 10. 11. 12. 13. 14.]
[ 11. 12. 13. 14. 15.]
[ 12. 13. 14. 15. 16.]]
关于python - Theano张量上的重叠迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31733166/