首页 > 解决方案 > CNTK 输入数据结构例如:CSTrainingCPUOnlyExamples

问题描述

我正在通过控制台应用程序使用 CNTK 的示例:LSTMSequenceClassifier:CSTrainingCPUOnlyExamples 使用默认数据文件:Train.ctf,它看起来像这样:

在此处输入图像描述

输入层是维度: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 维度,这部分是有道理的,但是输入层有问题。

标签: c#cntk

解决方案


编辑: @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

在哪里:

  • 序列号 = 0;
  • 特征名称 = "x";
  • 特征形状=“560:1”;
  • featureComment = "我是评论";
  • 标签名称 = "y";
  • 标签形状=“1 0 0 0 0”;
  • labelComment = "我是评论";

在 GPU 上,Frank 确实为每个 Minibatch 建议了大约 20 个序列,请参阅:https ://www.youtube.com/watch?v=TK671HxrufE @26:25

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

结束编辑...

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

BrainScript CNTK 文本格式阅读器使用 CNTKTextFormatReader

文档网继续解释:

CNTKTextFormatReader(后来简称为 CTF Reader)旨在使用根据以下规范格式化的输入文本数据。它支持以下主要功能: 每个文件多个输入流(输入) 稀疏和密集输入 可变长度序列 CNTK 文本格式 (CTF) 输入文件中的每一行包含一个用于一个或多个输入的样本。由于(显式或隐式)每一行也附加到一个序列,它定义了一个或多个序列、输入、样本关系。每个输入行的格式必须如下: [Sequence_Id](Sample or 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 comment |# another 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 的“序列”(“真实”可变长度序列在下面的扩展示例中解释)。每个输入标识符只能在一行中出现一次(这意味着每行要求每个输入一个样本)。一行中输入样本的顺序并不重要(从概念上讲,

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

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

此外,有用但不直接相关:读取数据并将数据提供给 CNTK 培训师


推荐阅读