主要内容

使用深度学习分类内存不足的文本数据

这个示例展示了如何使用转换后的数据存储对深度学习网络中的内存不足文本数据进行分类。

转换后的数据存储转换或处理从底层数据存储读取的数据。您可以使用转换后的数据存储作为深度学习应用程序的训练、验证、测试和预测数据集的来源。使用转换后的数据存储来读取内存不足的数据,或者在读取批量数据时执行特定的预处理操作。

当训练网络时,软件通过填充、截断或分割输入数据来创建相同长度的小批量序列。的trainingOptions函数提供填充和截断输入序列的选项,但是,这些选项不太适合字向量序列。此外,该函数不支持在自定义数据存储中填充数据。金宝app相反,您必须手动填充和截断序列。如果你left-pad并截断词向量序列,可以提高训练效果。

使用深度学习分类文本数据手动截断所有文档并将其填充为相同的长度。这个过程为非常短的文档添加了大量填充,并丢弃了非常长的文档中的大量数据。

或者,为了防止添加过多的填充或丢弃过多的数据,可以创建一个转换后的数据存储,将小批量输入到网络中。本例中创建的数据存储将文档的小批转换为序列或单词索引,并将每个小批的左垫值设置为小批中最长文档的长度。

加载预训练词嵌入

数据存储需要字嵌入来将文档转换为向量序列。加载一个预训练的词嵌入使用fastTextWordEmbedding.此功能需要文本分析工具箱™模型快速文本英语160亿令牌词嵌入金宝app支持包。如果没有安装此支金宝app持包,则该函数将提供下载链接。

emb = fasttextwordem寝料;

加载数据

中的数据创建表格文本数据存储factoryReports.csv.属性中的数据“描述”“类别”只列。

filenameTrain =“factoryReports.csv”;textName =“描述”;labelName =“类别”;ttdsTrain = tabularTextDatastore(文件名训练,“SelectedVariableNames”, (textName labelName]);

查看数据存储的预览。

预览(ttdsTrain)
ans =8×2表类别描述  _______________________________________________________________________ ______________________ {' 项目是偶尔陷于扫描器线轴。'}{'机械故障'}{'巨大的嘎嘎声和砰砰声来自装配活塞。'}{'机械故障'}{'启动工厂时电源有切断。'}{'电子故障'}{'汇编程序中的电容器烧坏。'}{'电子故障'}{'混合器触发保险丝。'}{'电子故障'}{'施工剂中的管道破裂正在喷射冷却剂。'}{'泄漏'}{'混合器中的保险丝熔断。'}{'电子故障'}{'东西继续从传送带上掉下来。'}{'机械故障'}

变换数据存储

创建一个自定义转换函数,将从数据存储读取的数据转换为包含预测器和响应的表。的transformText函数中读取的数据tabularTextDatastore对象并返回一个包含预测器和响应的表。预测因素有C——- - - - - -年代由词嵌入给出的词向量数组循证,在那里C是嵌入尺寸和年代是序列长度。响应是类的分类标签。

方法从训练数据中读取标签,以获得类名readLabels函数,列出并结束示例,并查找唯一的类名。

标签= readLabels(ttdsTrain,labelName);classNames =唯一的(标签);numObservations = numel(标签);

因为表格文本数据存储可以在一次读取中读取多行数据,所以您可以在转换函数中处理完整的小批数据。要确保转换函数处理完整的小批数据,请将表格文本数据存储的读取大小设置为将用于训练的小批大小。

miniBatchSize = 64;ttdsTrain。ReadSize = miniBatchSize;

若要将表格文本数据的输出转换为用于训练的序列,请使用变换函数。

tdsTrain = transform(ttdsTrain, @(data) transformText(data,emb,classNames))
tdsTrain = TransformedDatastore带有属性:底层数据存储:[1×1 matlab.io.datastore.]TabularTextDatastore] 金宝appSupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parquet" "parq" "png" "jpg" "jpeg" "tif" "tiff" "wav" "flac" "ogg" "mp4" "m4a"]转换:{@(数据)transformText(数据,emb,classNames)} IncludeInfo: 0

转换后的数据存储预览。预测因素有C——- - - - - -年代数组,年代序列长度和C是特征的数量(嵌入维数)。这些回答就是分类标签。

预览(tdsTrain)
ans =8×2表预测器响应_______________ __________________ {300×11单}机械故障{300×11单}机械故障{300×11单}电子故障{300×11单}电子故障{300×11单}电子故障{300×11单}泄漏{300×11单}电子故障{300×11单}机械故障

创建并训练LSTM网络

定义LSTM网络体系结构。为了将序列数据输入到网络中,包括一个序列输入层,并将输入大小设置为嵌入维数。接下来,包含一个包含180个隐藏单元的LSTM层。若要将LSTM层用于从序列到标签的分类问题,请将输出模式设置为“最后一次”.最后,添加一个输出大小等于类数量的全连接层、一个softmax层和一个分类层。

numFeatures = emb.Dimension;numHiddenUnits = 180;numClasses = numel(classNames);层= [...sequenceInputLayer numFeatures lstmLayer (numHiddenUnits,“OutputMode”“最后一次”) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];

指定培训选项。指定要的求解器“亚当”梯度阈值为2。数据存储不支持变换,所以设置金宝app“洗牌”,“永远”.每个纪元验证一次网络。若要监控培训进度,可设置“阴谋”选项“训练进步”.若要抑制详细输出,请设置“详细”

默认情况下,trainNetwork使用GPU(如果有的话)。若要手动指定执行环境,请使用“ExecutionEnvironment”的名称-值对参数trainingOptions.在CPU上进行训练比在GPU上进行训练花费的时间要长得多。使用GPU进行训练需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱)

numIterationsPerEpoch = floor(numObservations / miniBatchSize);选项= trainingOptions(“亚当”...“MaxEpochs”15岁的...“MiniBatchSize”miniBatchSize,...“GradientThreshold”2,...“洗牌”“永远”...“阴谋”“训练进步”...“详细”、假);

对LSTM网络进行训练trainNetwork函数。

net = trainNetwork(tdsTrain,layers,options);

使用新数据进行预测

对三个新报告的事件类型进行分类。创建包含新报告的字符串数组。

reportsNew = [...“冷却剂在分拣机下面。”“分拣机在启动时炸断保险丝。”“有一些非常响亮的咔嗒声从组装。”];

将预处理步骤作为训练文档对文本数据进行预处理。

documentsNew = preprocessText(reportsNew);

将文本数据转换为嵌入向量的序列doc2sequence

XNew = doc2sequence(emb,documentsNew);

利用训练好的LSTM网络对新序列进行分类。

labelsNew =分类(net,XNew)
labelsNew =3×1分类泄漏电子故障机械故障

文本转换函数

transformText函数中读取的数据tabularTextDatastore对象并返回一个包含预测器和响应的表。预测因素有C——- - - - - -年代由词嵌入给出的词向量数组循证,在那里C是嵌入尺寸和年代是序列长度。响应是类的分类标签一会

函数dataTransformed = transformText(数据,emb,classNames)预处理文档。textData = data{:,1};documents = preprocessText(textData);转换为序列。Predictors = doc2sequence(emb,documents);阅读标签。标签=数据{:,2};responses = categorical(labels,classNames);将数据转换为表。dataTransformed = table(预测器,响应);结束

预处理功能

这个函数preprocessText执行以下步骤:

  1. 使用标记化文本tokenizedDocument

  2. 使用将文本转换为小写较低的

  3. 删除标点符号erasePunctuation

函数documents = preprocessText(textData) documents = tokenizedDocument(textData);文档=较低(文档);documents = eraspunctuation(文档);结束

读取标签命令功能

readLabels函数的副本tabularTextDatastore对象运输大亨并从标签中读取labelName列。

函数标签= readLabels(ttds,labelName) ttdsNew = copy(ttds);ttdsNew。选择edVariableNames = labelName; tbl = readall(ttdsNew); labels = tbl.(labelName);结束

另请参阅

||||(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|(深度学习工具箱)|

相关的话题