Search code examples
pythoncntk

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


I am getting error in following code:

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

But when I run this it runs fine :

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})

I am not able to understand few things which slice method :

  1. At what array level it's going to slice.
  2. Acc. to documentation, second argument is begin_index, and next to it it end_index. How can being_index be greater than end_index.

Solution

  • There are two versions of slice(), one for slicing tensors, and one for slicing sequences. Your example uses the one for sequences.

    If your inputs are sequences (e.g. words), the first form, cntk.slice(), would individually slice every element of a sequence and create a sequence of the same length that consists of sliced tensors. The second form, cntk.sequence.slice(), will slice out a range of entries from the sequence. E.g. cntk.sequence.slice(x, 13, 42) will cut out sequence items 13..41 from x, and create a new sequence of length (42-13).

    If you intended to experiment with the first form, please change to cntk.slice(). If you meant the sequence version, please try to enclose x0 in an additional [...]. The canonical form of passing minibatch data is as a list of batch entries (e.g. MB size of 128 --> a list with 128 entries), where each batch entry is a tensor of shape (Ti,) + input_shape where Ti is the sequence length of the respective sequence. This

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

    would denote a minibatch with a single entry (1 list entry), where the entry is a sequence of 2 sequence items, where each sequence item has shape (8,1,3).

    The begin and end indices can be negative, in order to index from the end (similar to Python slices). Unlike Python however, 0 is a valid end index that refers to the end.