这个例子说明了如何使用深学习长短期记忆(LSTM)网络分类文本数据。
文本数据是自然顺序。一段文字是文字序列,这可能让他们之间的依赖关系。学习和使用长期依赖分类序列数据,使用LSTM神经网络。一个LSTM网络是一种类型的回归神经网络(RNN),可以学习序列数据的时间步长之间的长期相关性。
输入文本到LSTM网络,第一文本数据转换成数字序列。您可以使用文字编码,这映射文件,以数字索引的顺序实现这一目标。为了获得更好的效果,还包括一个字在网络中埋层。Word中的嵌入的词汇数值向量,而不是标量指数映射的话。这些的嵌入捕捉的话语义细节,让具有类似意义的词语,也有类似的载体。他们还通过向量算法模型词之间的关系。例如,关系“罗马是意大利的巴黎是法国“由下式描述的意大利-罗马+巴黎=法国。
有培训和在本例中使用LSTM网络四个步骤:
导入和预处理数据。
转换的话使用编码字数字序列。
创建并使用文字埋层训练的LSTM网络。
用训练LSTM网络分类新文本数据。
导入工厂报告数据。此数据包含标记的工厂事件的文字描述。要导入文本数据作为字符串,指定文本类型为'串'
。
文件名=“factoryReports.csv”;数据= readtable(文件名,'TextType','串');头(数据)
ANS =8×5表说明类别紧急分辨率成本_____________________________________________________________________ ____________________ ____________________ ________ _____“的相关文件偶尔会卡在扫描器卷轴。”“机械故障”,“中等”,“重新调整机” 45“大声剑拔弩张和敲打的声音从汇编活塞都来了。”“机械故障”,“中等”,“重新调整机” 35“有削减电力启动设备时。”“电子故障”“高”“完全替代” 16200“在汇编炒电容器。”“电子故障”“高”“替换组件” 352“混音器跳闸保险丝。”“电子故障”“低”“添加到收藏” 55“在构建代理爆管被喷洒冷却液。”“泄漏”“高”“替换组件” 371“A熔丝在混合器吹”。“电子故障”“低”“替换组件” 441“事情继续翻滚带了。”“机械故障”,“低”,“重新调整机” 38
这个例子的目的是将事件归由标签类别
柱。为了将数据分成类,这些标签转换为分类。
data.Category =分类(data.Category);
查看类的数据用柱状图的分布。
图直方图(data.Category);xlabel(“类”)ylabel(“频率”)标题(“级分配”)
下一步是将其划分为集培训和验证。将数据划分为训练分区,并进行验证和测试使用保留分区。指定抵抗比例为20%。
CVP = cvpartition(data.Category,'坚持',0.2);dataTrain =数据(训练(CVP),:);资料验证=数据(测试(CVP),:);
提取从分区表中的文本数据和标签。
textDataTrain = dataTrain.Description;textDataValidation = dataValidation.Description;YTrain = dataTrain.Category;YValidation = dataValidation.Category;
要检查是否已正确导入数据时,使用可视化词云培训文本数据。
图wordcloud(textDataTrain);标题(“训练数据”)
创建功能和标记化预处理的文本数据。功能preprocessText
在该示例的末尾列出的,执行下列步骤:
使用令牌化文本tokenizedDocument
。
将文本转换使用小写降低
。
使用擦除标点符号erasePunctuation
。
预处理训练数据,并使用验证数据preprocessText
功能。
documentsTrain = preprocessText(textDataTrain);documentsValidation = preprocessText(textDataValidation);
查看前几个预处理培训文件。
documentsTrain(1:5)
ANS = 5×1 tokenizedDocument:9个令牌:项都偶尔卡在扫描器线轴10级的令牌:大声拍击和敲打音从汇编器活塞未来10个令牌:在启动植物5令牌当有削减功率:炒电容器在汇编器4级的令牌:混合器跳闸熔丝
输入文件到一个网络LSTM,使用编码的文档转换成数字索引的序列的单词。
要创建一个字的编码,使用wordEncoding
功能。
ENC = wordEncoding(documentsTrain);
下一个转换步骤是垫和截断文档,以便它们都具有相同的长度。该trainingOptions
功能提供的选项用于垫和自动截断输入序列。然而,这些选项不能很好适合于字矢量的序列。取而代之的是,垫和手动截断序列。如果你左垫并截断字向量的序列,那么训练可能会提高。
要垫和截断的文件,先选择一个目标长度,然后是比它和左垫文件是比它短长截断文件。为获得最佳结果,目标长度应短而不丢弃大量的数据。找到一个合适的目标长度,查看训练文件长度的直方图。
documentLengths = doclength(documentsTrain);图直方图(documentLengths)标题(“文件长度”)xlabel(“长度”)ylabel(“文件数量”)
大部分的训练文档少于10个令牌。以此为截断和填充你的目标长度。
将文档转换为使用数字索引序列doc2sequence
。要截断或左垫序列具有长度10,设置'长度'
选项10。
sequenceLength = 10;XTrain = doc2sequence(ENC,documentsTrain,'长度',sequenceLength);XTrain(1:5)
ANS =5×1单元阵列{1×10双} {1×10双} {1×10双} {1×10双} {1×10双}
转换使用相同的选项验证文件序列。
XValidation = doc2sequence(ENC,documentsValidation,'长度',sequenceLength);
定义LSTM网络架构。到输入序列的数据到网络中,包括一个序列输入层和设置输入尺寸1。接着,包括字嵌入维50的层和相同数量的字作为字编码的。接着,包括LSTM层和隐藏单元的数量设置为80。要为序列对标签分类问题使用LSTM层,设置输出模式为'持续'
。最后,用相同的尺寸的类的数量,一个SOFTMAX层和分类层中添加完全连接层。
inputSize = 1;embeddingDimension = 50;numHiddenUnits = 80;NUMWORDS = enc.NumWords;numClasses = numel(类别(YTrain));层= [...sequenceInputLayer(inputSize)wordEmbeddingLayer(embeddingDimension,NUMWORDS)lstmLayer(numHiddenUnits,'输出outputmode','持续')fullyConnectedLayer(numClasses)softmaxLayer classificationLayer]
层= 6×1层阵列层:1“”字埋设层字嵌入与50点的尺寸层和423个的唯一字3“” LSTM LSTM用80个隐藏单元4“充分完全连接4”“序列与1名维2输入序列输入”连接层5 '' 使用SoftMax SOFTMAX 6 '' 分类输出crossentropyex
指定培训方式:
培养使用ADAM求解。
指定16的小批量大小。
洗牌每一个时代的数据。
监控通过设置训练进度“情节”
选项“训练进度”
。
指定使用的验证数据'ValidationData'
选项。
禁止通过设置详细的输出“放牧”
选项假
。
默认,trainNetwork
使用GPU(如果可用)(需要并行计算工具箱™和启用CUDA®GPU计算能力3.0或更高版本)。否则,它使用的CPU。要手动指定执行环境中,使用“执行环境”
的名称 - 值对参数trainingOptions
。在CPU上训练能比在GPU训练显著需要更长的时间。
选项= trainingOptions('亚当',...'MiniBatchSize'16,...'GradientThreshold',2,...“洗牌”,“每个历元”,...'ValidationData'{XValidation,YValidation}...“情节”,“训练进度”,...“放牧”,假);
使用训练LSTM网络trainNetwork
功能。
净= trainNetwork(XTrain,YTrain,层,选项);
分类的事件类型的三个新的报告。创建一个包含新报告的字符串数组。
reportsNew = [...“冷却液池下方分拣机。”“分拣机吹熔丝的启动。”“有一些来自汇编未来很响的声音乱撞。”]。
预处理使用预处理步骤的培训文档中的文本数据。
documentsNew = preprocessText(reportsNew);
使用文本数据转换为序列doc2sequence
使用相同的选项创建一个训练序列时。
XNew = doc2sequence(ENC,documentsNew,'长度',sequenceLength);
分类用训练LSTM网络的新序列。
labelsNew =分类(净,XNew)
labelsNew =3×1分类泄漏故障的电子机械故障
功能preprocessText
执行下列步骤操作:
使用令牌化文本tokenizedDocument
。
将文本转换使用小写降低
。
使用擦除标点符号erasePunctuation
。
功能文档= preprocessText(的TextData)%记号化的文字。文档= tokenizedDocument(的TextData);%转换为小写。文档=低级(文件);%擦除标点符号。文档= erasePunctuation(文件);结束
doc2sequence
|fastTextWordEmbedding
|lstmLayer
|sequenceInputLayer
|tokenizedDocument
|trainNetwork
|trainingOptions
|wordEmbeddingLayer
|wordcloud