CNTK LSTM如何定义序列的序列数据

时间:2018-01-22 01:55:55

标签: c# lstm cntk rnn

当我的数据如下:

1      |x 3:1 |y 8:1
1      |x 4:1 |y 
1      |x 5:1 |y 
1      |x 6:1 |y 
1      |x 7:1 |y 

我的变量声明如下:

var features = Variable.InputVariable(new int[] { inputDim }, DataType.Float, featuresName, null, true);
var labels = Variable.InputVariable(new int[] { numOutputClasses }, DataType.Float, labelsName, new List<Axis>() { Axis.DefaultBatchAxis() }, true);

然后代码可以工作,但是当我希望我的网络产生序列时 - &gt;序列所以我的数据看起来像这样:

1      |x 3:1 |y 4:1
1      |x 4:1 |y 5:1
1      |x 5:1 |y 6:1
1      |x 6:1 |y 7:1
1      |x 7:1 |y 8:1

我收到此错误:

Unhandled Exception: System.ArgumentOutOfRangeException: 
The dimension size (5) of the axis (1) of the Value ('[10 x 5 x 20]') 
must be 1, because this axis is not specified as a dynamic axis of 
the Variable ('Input('labels', [10], [#])').

我如何告诉CNTK这是可以的,我希望在序列的每一步输出,所以我认为应该有这些数据,这是一个经典的多对多LSTM。但无论是CNTK c#api都破了,或者我只是不知道怎么告诉它我想做什么(最有可能)。

10个输入,10个输出,第一个序列中的5个元素,我的批次中的20个序列。

1 个答案:

答案 0 :(得分:2)

诀窍是删除:new List<Axis>() { Axis.DefaultBatchAxis() } 从标签,默认是允许一个序列,这意味着这不是一个序列&#39;,doh!

e.g。

var labels = Variable.InputVariable(
                 new int[] { numOutputClasses },
                 DataType.Float,
                 labelsName,
                 null,
                 true
             );

顺便说一句,你必须确保你的网络模型也不会破坏序列,所以不要使用CNTKLib.SequenceLast(LSTMFunction) :-)

感谢KeDengMS向我解释这个问题:-)