CNTK输入数据结构,例如:CSTrainingCPUOnlyExamples

时间:2019-02-10 10:56:53

标签: c# cntk

我正在通过控制台应用程序LSTMSequenceClassifier使用CNTK示例:CSTrainingCPUOnlyExamples,并使用默认数据文件Train.ctf,如下所示:

enter image description here

输入层的尺寸为:2000(一个热向量),输出为:5个类( Softmax )。

文件通过以下方式加载:

MinibatchSource minibatchSource = MinibatchSource.TextFormatMinibatchSource(Path.Combine(DataFolder, "Train.ctf"), streamConfigurations, MinibatchSource.InfinitelyRepeat, true);

StreamInformation featureStreamInfo = minibatchSource.StreamInfo(featuresName);

StreamInformation labelStreamInfo = minibatchSource.StreamInfo(labelsName);

我真的很感激如何生成数据文件以及2000输入如何映射到5类输出。

当然,我的目标是编写一个应用程序以格式化并将数据保存到可以读取为输入数据文件的文件中。当然,我需要了解该结构才能完成这项工作。

谢谢!

我看到了Y维度,这部分很有意义,但是输入层有问题。

1 个答案:

答案 0 :(得分:1)

编辑:@Frank Seide MSFT

我想知道您是否可以验证并提供最佳做法:

private string Format(int sequenceId, string featureName, string featureShape, string labelName, string featureComment, string labelShape, string labelComment)
{
    return $"{sequenceId} |{featureName.Replace(" ","-")} {featureShape} |# {featureComment}   |{labelName.Replace(" ","-")} {labelShape} |# {labelComment}\r\n";
}

这可能会返回类似的内容:

0 |x 560:1 |# I am a comment   |y 1 0 0 0 0 |# I am a comment

位置:

  • sequenceId = 0;
  • featureName =“ x”;
  • featureShape =“ 560:1”;
  • featureComment =“我是评论”;
  • labelName =“ y”;
  • labelShape =“ 1 0 0 0 0”;
  • labelComment =“我是评论”;

在GPU上,弗兰克确实建议每个微型批处理大约20个序列,请参阅:https://www.youtube.com/watch?v=TK671HxrufE @ 26:25

这是用于自定义C#数据集格式。

结束编辑...

一个偶然的发现,我找到了一些文档的答案:

  

BrainScript CNTK Text Format Reader使用CNTKTextFormatReader

documtnet继续解释:

  

CNTKTextFormatReader(后称CTF阅读器)旨在使用根据以下规范设置格式的输入文本数据。它支持以下主要功能:   每个文件有多个输入流(输入)   稀疏和密集输入   可变长度序列   CNTK文本格式(CTF)   输入文件中的每一行包含一个样本,用于一个或多个输入。由于(显式或隐式)每一行也都附加到序列上,因此它定义了一个或多个序列,输入,样本关系。每个输入行的格式必须如下:   [Sequence_Id](示例或评论)+   。   哪里   样本= |输入名称(值)*   评论= |#一些内容   每行以序列ID开头,并包含一个或多个样本(换句话说,每行是样本的无序集合)。   序列ID是一个数字。可以省略,在这种情况下,行号将用作序列ID。   每个样本实际上都是由输入名称和对应的值向量组成的键/值对(映射到更高维度是网络本身的一部分)。   每个样本都以竖线符号(|)开头,后跟输入名称(无空格),后跟空白定界符,然后是值列表。   对于稀疏输入,每个值可以是数字,也可以是索引前缀的数字。   制表符和空格都可以互换用作定界符。   注释以竖线开头,后跟一个井号:#,然后是注释的实际内容(正文)。主体可以包含任何字符,但是主体中的管道符号需要通过在其上附加哈希符号来进行转义(请参见下面的示例)。注释的正文一直持续到行尾或下一个未转义的管道(以先到者为准)。

方便,并给出答案。

  

与上面的阅读器配置相对应的输入数据应如下所示:   | B 100:3 123:4 | C 8 | A 0 1 2 3 4 |#一个CTF注释   |#其他评论| A 0 1.1 22 0.3 54 | C 123917 | B 1134:1.911 13331:0.014   | C -0.001 |#带有转义管道的注释:'|#'| A 3.9 1.11 121.2 99.13 0.04 | B 999:0.001 918918:-9.19

     

请注意以下有关输入格式的信息:   | Input_Name标识每个输入样本的开头。该元素是必需元素,后跟对应的值向量。   密集向量只是浮点值的列表;稀疏向量是index:value元组的列表。   制表符和空格都可以用作值定界符(在输入向量内)以及输入定界符(在输入之间)。   每条单独的行构成一个长度为1的“序列”(“实数”可变长度序列将在下面的扩展示例中进行说明)。   每个输入标识符只能在单行上出现一次(这意味着每个输入每行要求一个样本)。   一行中输入样本的顺序并不重要(从概念上讲,每行都是键值对的无序集合)   每条格式正确的行都必须以“换行” \ n或“回车,换行” \ r \ n符号结尾。

此视频中输入和标签数据上的一些很棒的内容:

https://youtu.be/hMRrqkl77rI-@ 30:23 https://youtu.be/Vi05nEzAS8Y-@ 25:20

也有帮助,但没有直接关系:Read and feed data to CNTK Trainer