如何使用聚合1D向量?

时间:2017-02-06 21:03:29

标签: cntk

一直试图在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()

1 个答案:

答案 0 :(得分:2)

原因是cntk期望提供一批示例。 当它看到一个(15,1)数组时,它将它转换为一组15个例子,每个例子的长度为1。 然后当应用gather时,cntk不满意,因为minibatch中的一些示例产生空序列(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)})

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