主要内容

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

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

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

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

使用深度学习对文本数据进行分类示例手动截断并填充所有文档到相同的长度。这个过程向非常短的文档添加大量填充,并丢弃非常长的文档中的大量数据。

或者,为了防止添加太多填充或丢弃太多数据,可以创建一个转换后的数据存储,将小批数据输入到网络中。在此示例中创建的数据存储将文档的小批转换为序列或单词索引,并将每个小批的空白填充为小批中最长文档的长度。

加载预训练的单词嵌入

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

emb = fasttextwordem寝食;

加载数据

中的数据创建表格文本数据存储factoryReports.csv.对象中读取数据“描述”而且“类别”只列。

filenameTrain =“factoryReports.csv”;textName =“描述”;labelName =“类别”;ttdsTrain = tabularTextDatastore(fileenametrain,“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 =具有属性的transformmeddatastore:底层数据存储:[1×1 matlab.io.datastore.]TabularTextDatastore] 金宝appSupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parq" "png" "jpg" "jpeg" "tif" "tiff" "wav" "flac" "ogg" "mp4" "m4a"]转换:{@(data)transformText(data,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”“最后一次”) fulllyconnectedlayer (numClasses) softmaxLayer classificationLayer];

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

默认情况下,trainNetwork如果有图形处理器,使用图形处理器。要手动指定执行环境,请使用“ExecutionEnvironment”的名值对参数trainingOptions.在CPU上进行训练比在GPU上进行训练要长得多。使用GPU进行培训需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持按版本划分(并行计算工具箱)

numIterationsPerEpoch = floor(numObservations / miniBatchSize);options = 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 = category (net,XNew)
labelsNew =3×1分类泄漏电子故障机械故障

转换文本函数

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

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

预处理功能

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

  1. 使用标记化文本tokenizedDocument

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

  3. 使用以下方法删除标点符号erasePunctuation

函数documents = preprocessText(textData) documents = tokenizedDocument(textData);文件=下(文件);文档= erasePunctuation(文档);结束

阅读标签命令功能

readLabels类的副本tabularTextDatastore对象运输大亨读取标签labelName列。

函数标签= readLabels(ttds,labelName) ttdsNew =拷贝(ttds);ttdsNew。年代electedVariableNames = labelName; tbl = readall(ttdsNew); labels = tbl.(labelName);结束

另请参阅

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

相关的话题