CNTK RuntimeError: AddSequence: Sequences must be a least one frame long

CNTK RuntimeError: AddSequence: Sequences must be a least one frame long

我在以下代码中遇到错误:

x = cntk.input_variable(shape=c(8,3,1))
y = cntk.sequence.slice(x,1,0)
x0 = np.reshape(np.arange(48.0,dtype=np.float32),(2,8,1,3))
y.eval({x:x0})

Error : Sequences must be a least one frame long

但是当我 运行 这样做时 运行 没问题:

x = cntk.input_variable(shape=c(3,2)) #change
y = cntk.sequence.slice(x,1,0)
x0 = np.reshape(np.arange(24.0,dtype=np.float32),(1,8,1,3))  #change
y.eval({x:x0})

我无法理解 slice 方法中的一些事情:

  1. 它将在哪个数组级别切片。
  2. 累积对于文档,第二个参数是 begin_index,在它旁边是 end_indexbeing_index怎么可能大于end_index

slice()有两个版本,一个是张量切片,一个是序列切片。您的示例使用序列。

如果您的输入是序列(例如单词),第一种形式 cntk.slice() 将单独切片序列的每个元素并创建由切片张量组成的相同长度的序列。第二种形式 cntk.sequence.slice() 将从序列中切出一系列条目。例如。 cntk.sequence.slice(x, 13, 42) 将从 x 中删除序列项 13..41,并创建一个长度为 (42-13) 的新序列。

如果您打算尝试第一种形式,请更改为 cntk.slice()。如果您指的是序列版本,请尝试将 x0 附加在 [...] 中。传递小批量数据的规范形式是批量条目列表(例如 MB 大小为 128 --> 包含 128 个条目的列表),其中每个批量条目都是形状为 (Ti,) + input_shape 的张量,其中 Ti是相应序列的序列长度。这个

x0 = [ np.reshape(np.arange(48.0,dtype=np.float32),(2,8,1,3)) ]

表示具有单个条目(1 个列表条目)的小批量,其中条目是 2 个序列项的序列,其中每个序列项的形状为 (8,1,3)。

开始和结束索引可以是负数,以便从末尾开始索引(类似于Python 切片)。然而,与 Python 不同的是,0 是指向结尾的有效结尾索引。