我是CNTK的新手。我的环境是C#(不幸的是,我不是python或BrainScript程序员)。

我正在尝试使用CNTK在自由文本(NLP)上设计/训练/测试LSTM,以选择适当的标题(从给定的标题集中,我的数据中有大约8,000个)。

我使用了一个单独的程序将每个单词映射到一个包含100个元素的实数向量中(100是可配置的值;我的非CNTK程序GloVe可以生成我选择的任何宽度)。

我的原始输入看起来像:

|label 17 |features the brown fox jumped over the ...
|label 19 |features there comes a time when all ...
...


其中“ 17”是第17个标题的简写,并且实际上是一个热门的表示形式:[0,0,...,1,0,0,...]其中“ 1”在第17个标题中-位置。

每个输入行都是一个单词序列(用空格分隔)-典型的长度是几百个单词,但是某些数据(行)中却包含数千个单词。

我的问题是,我不知道如何将原始文件格式的运行时转换插入CNTK可以使用的内容中。

我无法假定内存中的数据,因为在生产中,我们将对具有数百万行的数据进行培训。

在每个小批量中:

“ 17”(在上面的示例中)需要转换为[0,...,1,1,0,...]。

每个单词都需要翻译(通过查找C#词典)成一个数组(包含100个实数)。

我意识到这是CNTK的LSTM中的嵌入层,但是我找不到任何教程/示例(尤其是在C#中),以了解如何使用非热一嵌入来添加转换层。

尽管有其全部价值,但我在C#中执行此操作的模板是CNTK示例中的LSTMSequenceClassifier.cs。

链接到CNTK示例:
https://github.com/Microsoft/CNTK/blob/master/Examples/TrainingCSharp/Common/LSTMSequenceClassifier.cs

任何帮助将不胜感激。在过去的一周里,我全力以赴!

最佳答案

由于我也是新手,但我觉得我宁愿使用最原始的数据格式,而不是使用CNTK的更高级功能。

我的方法是

0   |feature  43:1   |label 0 0 1 0
0   |feature  23:1
0   |feature  15:1
0   |feature  34:1
1   |feature  37:1   |label 0 0 0 1
1   |feature  67:1
1   |feature  69:1
1   |feature  12:1


其中最大分类是4个不同的分类



43rd word in your matrix is "the"
23rd is "fox"


等等等等

参考https://cntk.ai/pythondocs/sequence.html

我知道第一次阅读python可能会造成混乱,但是您会发现它的窍门

https://github.com/Microsoft/CNTK/tree/master/Tests/EndToEndTests/Text/SequenceClassification/Data

具有示例教程中使用的数据文件

关于c# - 作法:使用Word2Vec嵌入字词的CNTK C#LSTM自由文本(NLP)分类器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47639108/

10-12 21:13