我正在尝试在CNTK中实现LSTM(使用Python)对序列进行分类。

输入:

  • 功能是固定长度的数字序列(时间序列)
  • 标签是一键热值的矢量

  • 网络:
    input = input_variable(input_dim)
    label = input_variable(num_output_classes)
    h = Recurrence(LSTM(lstm_dim)) (input)
    final_output = C.sequence.last(h)
    z = Dense(num_output_classes) (final_output)
    loss = C.cross_entropy_with_softmax(z, label)
    

    输出:
    序列与标签匹配的概率

    所有尺寸都是固定的,所以我认为我不需要任何动态轴,也没有指定任何轴。

    但是,CNTK并不高兴,我得到:
    return cross_entropy_with_softmax(output_vector, target_vector, axis, name)
    RuntimeError: Currently if an operand of a elementwise operation has any dynamic axes, those must match the dynamic axes of the other operands
    

    如果(按照某些示例)我定义了带有动态轴的标签
    label = input_variable(num_output_classes, dynamic_axes=[C.Axis.default_batch_axis()])
    

    它不再对此有所提示,并且可以进一步做到:
    tf = np.split(training_features,num_minibatches)
    tl = np.split(training_labels, num_minibatches)
    
    for i in range(num_minibatches*num_passes): # multiply by the
        features = np.ascontiguousarray(tf[i%num_minibatches])
        labels = np.ascontiguousarray(tl[i%num_minibatches])
    
        # Specify the mapping of input variables in the model to actual minibatch data to be trained with
        trainer.train_minibatch({input : features, label : labels})
    

    但是死于此错误:
      File "C:\Users\Dev\Anaconda3\envs\cntk-py34\lib\site-packages\cntk\cntk_py.py", line 1745, in train_minibatch
        return _cntk_py.Trainer_train_minibatch(self, *args)
    RuntimeError: Node '__v2libuid__Plus561__v2libname__Plus552' (Plus operation): DataFor: FrameRange's dynamic axis is inconsistent with matrix: {numTimeSteps:1, numParallelSequences:100, sequences:[{seqId:0, s:0, begin:0, end:1}, {seqId:1, s:1, begin:0, end:1}, {seqId:2, s:2, begin:0, end:1}, {seqId:3, s:3, begin:0, end:1}, {seq...
    

    我需要做些什么来解决这个问题?

    最佳答案

    如果我正确理解这一点,那么您就有一维输入的序列。如果是这样,那么您的麻烦就源于此行

    input =  input_variable(input_dim)
    

    它声明了input_dim维向量的序列。如果您将其更改为
    input = input_variable(1)
    

    那么我相信您的最初尝试应该会奏效。

    更新:上面的操作本身是不够的,因为采用序列最后一个元素的操作会创建一个输出,该输出的动态轴与创建标签的默认动态轴不同。一个简单的解决方法是在定义了输出z之后定义标签,如下所示
    label = input_variable(num_output_classes, dynamic_axes=z.dynamic_axes)
    

    这对我没有任何提示。然后,我像这样输入一些虚拟数据(假设最小批量为4,序列长度为5和3个类)
    x = np.arange(20.0, dtype=np.float32).reshape(4,5,1)
    y = np.array([1,0,0,0,1,0,0,0,1,0,0,1], dtype=np.float32).reshape(4,1,3)
    loss.eval({input: x, label:y })
    

    并按预期工作。

    关于python - LSTM中关于动态轴的CNTK提示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41198525/

    10-12 22:41