如何在一维向量上使用聚集?

How to use gather on 1D vector?

一直在尝试在 1D 向量上使用 cntk.ops.gather。这是一个说明什么不起作用的片段:

import cntk
import numpy as np

def main():
    xx = cntk.input_variable(shape=(1))
    yy = cntk.input_variable(shape=(1))
    zz = cntk.sequence.gather(xx, yy)

    xx_value = np.arange(15, dtype=np.float64)
    yy_value = np.array([1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1], dtype=np.float64)
    aa = zz.eval({xx: xx_value.reshape(-1, 1), yy: yy_value.reshape(-1, 1)})
    print(aa)

if __name__ == "__main__":
    main()

原因是cntk希望能提供一批样例。 当它看到 (15,1) 数组时,它会将其转换为一批 15 个示例,每个示例的长度为 1。 然后,当应用 gather 时,cntk 不高兴,因为小批量中的一些示例产生空序列(那些在 yy_value 中有 0 的示例)。

您可以通过几种不同的方式指定您在小批量中只有一个示例这一事实来解决您的问题。

  • 您可以像这样在列表中提供值

    aa = zz.eval({xx: [xx_value.reshape(-1, 1)], yy: [yy_value.reshape(-1, 1)]})

  • 您可以像这样提供形状为 (1,15,1) 的张量中的值:

    aa = zz.eval({xx: xx_value.reshape(1, -1, 1), yy: yy_value.reshape(1, -1, 1)})

后者仅在小批量中的所有序列具有相同长度时才有效。