【问题标题】:CNTK LSTM input shapeCNTK LSTM 输入形状
【发布时间】:2018-09-07 09:53:02
【问题描述】:

我们正在使用 CNTK 的 C# API 构建 LSTM 网络,但发现根据 CNTK 文档的当前级别确定输入的正确形状/尺寸非常困难。

我们有一个时间序列,在每个时间 t 都有一个值(一个数字),我们希望使用时间序列的前 744 个值的序列来使用 LSTM 进行预测。此外,我们是否要制作一个包含 25 个序列的 minibatch,CNTK.InputVariable 的形状应该如何:

[0] 744

[1] 1

[2] 25

[0] 1

[1] 744

[2] 25

...然后,如果我们不是在每个时间 t 有一个值,而是有两个值,那么 CNTK.InputVariable 的形状会是什么样子?

【问题讨论】:

    标签: cntk


    【解决方案1】:

    如果您使用循环网络(LSTM、GRU),那么您需要知道什么是静态轴和动态轴。 静态轴用于描述输入数据形式(在第一种情况下,它是秩为 1 且大小为 1 的向量:new int {1})。 动态轴用于指定输入数据(在您的情况下为 new int {1})的序列(在您的情况下为可变长度 744)。要指示动态轴应该用于序列,请在输入参数 dynamicAxes: 中指定它:new[] { Axis.DefaultBatchAxis() }

    var inputDimension = 1; //for two values is 2 etc.  
    var inputShape = new { inputDimension  };
    var input = Variable.InputVariable(inputShape, DataType.Double, "input", new[] { Axis.DefaultBatchAxis() });
    

    并确保正确准备小批量(创建一个小批量的示例):

            var device = DeviceDescriptor.CPUDevice;
            var inputDimension = 1;
            var outputDimension = 1;
            var minibatchSize = 25;
            var oneMinibatchFeaturesData = new List<List<double[]>>(minibatchSize)
            {
                new List<double[]> //first sequence
                {
                    new double[] { 23 },//t=1. Array.Length = inputDimension
                    new double[] { 25 },//t=2
                    //...
                    new double[] { 65 },//t=744
                },
                new List<double[]> //second seqeunce
                {
                    new double[] { 76 }, //t=1
                    new double[] { 236 },//t=2
                    //...
                    new double[] { 87 }, //t=744
                },
                //...
                new List<double[]> //twenty fifth sequence 
                {
                    new double[] { 9 }, //t=1
                    new double[] { 2 },//t=2
                    //...
                    new double[] { 90 }, //t=744
                },
            };
            var oneMinibatchLabelsData = new List<double[]>(minibatchSize)
            {
                new double[] { 1 },//label of first sequence. Array.Length = outputDimension
                new double[] { 5 },//label of second sequence
                //...
                new double[] { 3 }//label of twenty fifth sequence 
            };
    
            var features = Value.CreateBatchOfSequences(new[] { inputDimension }, oneMinibatchFeaturesData.Select(sequence => sequence.SelectMany(value => value)), device);
            var labels = Value.CreateBatch(new[] { outputDimension }, oneMinibatchLabelsData.SelectMany(value => value), device);
    

    序列的长度可以是任意的。一个 minibatch 可能包含不同长度的序列。

    LSTM 很难在这种长度的序列上训练。如果您的序列长度始终为 744,那么您可能应该使用输入维度为 744 的简单 FNN。

    【讨论】:

      【解决方案2】:

      我推荐深入研究CNTK Readers!

      @Stanislav Grigorev 是正确的。

      输入维度完全取决于您的数据集。例如,此处示例中的ATIS 如下所示:

      代码示例可以在here找到。

      用阅读器读入数据:

      IList<StreamConfiguration> streamConfigurations = new StreamConfiguration[]
      { 
          new StreamConfiguration(featuresName, inputDim, true, "S0"), 
          // new StreamConfiguration(featuresName, inputDim, true, "S1"), // Not used in the old example.
          new StreamConfiguration(labelsName, numOutputClasses, false, "S2") 
      };
      

      以及使用 TextFormatMinibatchSource 读取:

      var minibatchSource = MinibatchSource.TextFormatMinibatchSource(
                            Path.Combine(DataFolder, "Train.ctf"), 
                            streamConfigurations,
                            MinibatchSource.InfinitelyRepeat,
                            true);
      
      var featureStreamInfo = minibatchSource.StreamInfo(featuresName);
      var labelStreamInfo = minibatchSource.StreamInfo(labelsName);
      

      然后是一行,在while循环中:

      var minibatchData = minibatchSource.GetNextMinibatch(minibatchSize, device);
      

      读取每个小批量。这对任何阅读代码的人来说都是显而易见的,但为了说明数据的读取方式,我提供了这个示例。

      数据集参数在代码示例中给出:

      const int inputDim = 2000;
      const int numOutputClasses = 5;
      

      重要的是这些数字是正确的!

      我已经创建了一个网站:http://www.cntking.com/ 来尝试在 C# 和 CNTK 上取得成功,我认为它是一种非常被低估的机器学习语言 C#。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-27
        • 2019-01-20
        • 1970-01-01
        • 2017-01-12
        相关资源
        最近更新 更多