CNTK输入数据结构例如:CSTrainingCPUOnlyExamples

问题描述 投票:2回答:1

我正在使用CNTK的示例:LSTMSequenceClassifier通过控制台应用程序: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 Dimension,这个部分很有意义,但是输入层有问题。

c# cntk
1个回答
1
投票

编辑:@Frank Silk 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上,Frank确实为每个Minibatch建议了大约20个序列,参见:https://www.youtube.com/watch?v=TK671HxrufE @ 26:25

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

结束编辑...

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

BrainScript CNTK Text Format Reader使用CNTKTextFormatReader

documtnet继续解释:

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

方便,并给出答案。

与上述阅读器配置相对应的输入数据应如下所示:| B 100:3 123:4 | C 8 | A 0 1 2 3 4 | #a CTF注释| #axta comment | 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标识每个输入样本的开头。该元素是必需的,后跟对应的值向量。密集向量只是一个浮点值列表;稀疏向量是索引列表:值元组。选项卡和空格都允许作为值分隔符(在输入向量内)以及输入分隔符(在输入之间)。每条单独的线构成长度为1的“序列”(“Real”可变长度序列在下面的扩展实例中解释)。每个输入标识符只能在一行上出现一次(每个行每个输入要求转换为一个样本)。一行中输入样本的顺序并不重要(概念上,每一行都是一个无序的键值对集合)每个格式良好的行必须以“换行符”\ n或“回车符,换行符”结尾\ r \ n符号。

本视频中输入和标签数据的一些精彩内容:

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

此外,有用但不直接相关:Read and feed data to CNTK Trainer

© www.soinside.com 2019 - 2024. All rights reserved.