一直试图在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()
答案 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)})
后者仅在小批量中的所有序列具有相同长度时起作用。