主要内容

使用自定义训练循环对文本数据进行分类

此示例显示如何使用具有自定义训练循环的深度学习双向短期内存(Bilstm)网络对文本数据进行分类。

使用使用的深度学习网络时trainNetwork功能,如果trainingOptions不提供您需要的选项(例如,自定义学习速率计划),那么您可以使用自动区分定义您自己的自定义训练循环。的示例,展示了如何使用trainNetwork功能,请参阅使用深度学习对文本数据进行分类(深度学习工具箱)

这个例子训练一个网络用基于时间的衰减学习率计划:对于每次迭代,求解器使用给定的学习率 ρ t ρ 0 1 + k t ,在那里t为迭代数, ρ 0 是初始学习率,和k是衰减的。

导入数据

导入工厂报表数据。该数据包含有标签的工厂事件的文本描述。若要将文本数据导入为字符串,请指定文本类型“字符串”

文件名=“factoryreports.csv”;data = readtable(文件名,“TextType”“字符串”);头(数据)
ans =.8×5表类别描述紧急解决成本  _____________________________________________________________________ ____________________ ________ ____________________ _____ " 项目是偶尔陷入扫描仪卷。”“机械故障”、“中等”、“重新调整机器”、“组装器的活塞发出响亮的咔嗒咔嗒和砰砰的声音。”“机械故障”“中等”“调整机器”“启动工厂时电源被切断”“电子故障”“高”“完全更换”“16200”“组装器内电容器烧毁”“电子故障”“高”“更换元件”“352”“混频器跳闸保险丝。”“电子故障”“低”“列入观察名单”“55”施工剂中爆管正在喷洒冷却剂。"泄漏" "高" "更换部件" 371 "混合器内保险丝熔断"“电子故障”“低”“更换部件”“东西不断从传送带上掉下来。”“机械故障”“低”“重新调整机

此示例的目标是通过标签对事件进行分类类别列。要将数据划分为类,请将这些标签转换为分类。

数据。类别=分类(data.Category);

使用直方图查看数据中类的分布。

图直方图(data.Category);包含(“班级”) ylabel (“频率”) 标题(“类分配”

下一步是将其划分为训练和验证集。将数据划分为训练分区和保留分区,用于验证和测试。指定拒绝符百分比为20%。

本量利= cvpartition(数据。类别,“坚持”, 0.2);dataTrain =数据(训练(cvp):);dataValidation =数据(测试(cvp):);

从分区表中提取文本数据和标签。

textDataTrain = dataTrain.Description;textDataValidation = dataValidation.Description;YTrain = dataTrain.Category;YValidation = dataValidation.Category;

要检查是否正确导入了数据,请使用单词云可视化训练文本数据。

图wordcloud (textDataTrain);标题(“训练数据”

查看类个数。

类=类别(YTrain);numClasses =元素个数(类)
numClasses = 4

预处理文本数据

创建一个用于标记和预处理文本数据的函数。这个函数preprocessText,执行以下步骤:

  1. 使用标记文本tokenizedDocument

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

  3. 使用标点符号使用侵蚀

对训练数据和验证数据进行预处理preprocessText函数。

documentstrain = preprocesstext(textdataTrain);documentsvalidation = preprocesstext(textdatavalidation);

查看前几个预处理的培训文件。

documentsTrain (1:5)
ans = 5×1 tokenizedDocument: 9令牌:项目中偶尔陷入扫描仪线轴10令牌:大声作响,声音来自汇编活塞5令牌:油炸电容器在汇编程序4令牌:搅拌机绊倒融合9令牌:爆管的构造代理喷洒冷却剂

通过创建创建一个包含文档和标签的单一数据存储arrayDatastore对象,然后使用结合函数。

dsDocumentsTrain = arrayDatastore (documentsTrain,“OutputType”“细胞”);dsYTrain = arrayDatastore (YTrain,“OutputType”“细胞”);dsTrain =结合(dsDocumentsTrain dsYTrain);

使用相同的步骤为验证数据创建数据存储。

dsDocumentsValidation = arrayDatastore (documentsValidation,“OutputType”“细胞”);dsYValidation = arrayDatastore (YValidation,“OutputType”“细胞”);dsValidation =结合(dsDocumentsValidation dsYValidation);

创建单词编码

要将文档输入到BiLSTM网络,请使用单词编码将文档转换为数字索引序列。

要创建单词编码,请使用wordEncoding函数。

内附= wordEncoding (documentsTrain)
enc = workencoding属性:numwords:421词汇表:[1×421字符串]

定义网络

定义BiLSTM网络体系结构。要将序列数据输入到网络中,需要包含一个序列输入层,并设置输入大小为1。接下来,包括一个25维的单词嵌入层和与单词编码相同的单词数量。接下来,包括一个BiLSTM层,并设置隐藏单位的数量为40。要将BiLSTM层用于序列到标签的分类问题,请将输出模式设置为“最后一次”.最后,添加一个与类数相同大小的全连接层和一个softmax层。

inputSize = 1;embeddingDimension = 25;numHiddenUnits = 40;numWords = enc.NumWords;[sequenceInputLayer(inputSize,“名字”“在”)wordembeddinglayer(嵌入式,numwords,“名字”“循证”)Bilstmlayer(numhidendunits,“OutputMode”“最后一次”“名字”'bilstm') fullyConnectedLayer (numClasses“名字”“俱乐部”) softmaxLayer (“名字”“sm”)]
层= 5×1层与层:数组1”的序列输入序列输入1维2“循证”字嵌入层字嵌入层25维度和421个独特的单词3‘bilstm bilstm bilstm 40隐藏单位4“俱乐部”完全连接完全连接层5“sm”Softmax Softmax

将层阵列转换为层图形,并创建dlnetwork.对象。

lgraph = layerGraph(层);dlnet = dlnetwork (lgraph)
dlnet = dlnetwork with属性:图层:[5×1 nnet.cnn.layer.layer]连接:[4×2表]了解:[6×3表]状态:[2×3表]输入名称:{'in'} OutputNames:{'sm'}

定义模型渐变功能

创建函数MapicalGRADENTERS.,它需要一个dlnetwork.对象的一个小批具有相应标签的输入数据,并返回损失相对于网络中可学习参数的梯度和相应的损失。

指定培训选项

训练30个时代,小批量16个。

numEpochs = 30;miniBatchSize = 16;

指定ADAM优化选项。用0.01,梯度衰减因子0.9和平方梯度衰减因子0.999指定0.001的初始学习速度为0.001,梯度衰减因子0.90.999。

initiallearnrate = 0.001;衰减= 0.01;梯度Dayfactor = 0.9;squaredgradientdecayfactor = 0.999;

火车模型

使用自定义训练循环训练模型。

初始化培训进度图。

figure lineosstrain = animatedline('颜色',[0.85 0.325 0.098]);linelossvalidation =动画线(...'linestyle'“——”...“标记”'o'...“MarkerFaceColor”“黑”);ylim([0正])包含(“迭代”) ylabel (“损失”) 网格

初始化Adam的参数。

trailingAvg = [];trailingAvgSq = [];

创建一个minibatchqueue对象,该对象处理和管理小批量数据。为每个mini-batch:

  • 使用自定义小批量预处理功能preprocessMiniBatch(在本例的最后定义)将文档转换为序列并对标签进行一次性编码。要将单词编码传递给迷你批处理,请创建一个接受两个输入的匿名函数。

  • 使用维度标签格式化预测器“BTC”(批量、时间、通道)。的minibatchqueue默认情况下,对象将数据转换为dlarray具有底层类型的对象

  • 在可用的GPU上进行训练。的minibatchqueue对象,默认情况下,将每个输出转换为gpuArray如果可用GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持设备的信息,请参阅金宝appGPU通金宝app过发布支持(并行计算工具箱)

MBQ = Minibatchqueue(Dstrain,...“MiniBatchSize”,小匹马,...“MiniBatchFcn”@ (X, Y) preprocessMiniBatch (X, Y, enc),...“MiniBatchFormat”,{“BTC”''});

创建一个minibatchqueue对象,并指定返回部分小批量。

mbqValidation = minibatchqueue (dsValidation,...“MiniBatchSize”,小匹马,...“MiniBatchFcn”@ (X, Y) preprocessMiniBatch (X, Y, enc),...“MiniBatchFormat”,{“BTC”''},...“PartialMiniBatch”“返回”);

培训网络。对于每个epoch,洗牌数据并在小批数据上循环。在每次迭代结束时,显示训练进度。在每个epoch的末尾,使用验证数据验证网络。

为每个mini-batch:

  • 将文档转换为整数序列并对标签进行一次性编码。

  • 将数据转换为dlarray基础类型为single的对象,并指定维度标签“BTC”(批量、时间、通道)。

  • 对于GPU培训,转换为gpuArray对象。

  • 评估模型梯度、状态和损失使用dlfevalMapicalGRADENTERS.函数,并更新网络状态。

  • 确定基于时间的衰变学习率计划的学习率。

  • 使用adamupdate.函数。

  • 更新培训计划。

迭代= 0;start = tic;%循环纪元。时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);%循环小批。Hasdata (mbq) iteration = iteration + 1;%读取小批数据。[dlX, dlY] = next(mbq);使用dlfeval和%MACEMEGRADENTERS功能。(渐变,亏损)= dlfeval (@modelGradients, dlnet dlX,海底);为基于时间的衰减学习率计划确定学习率。LearnRate = InitialLearnrate /(1 +衰减*迭代);%使用ADAM Optimizer更新网络参数。[dlnet,trailingAvg,trailingAvgSq] = adamupdate(dlnet, gradient,...trailingAvg, trailingAvgSq, iteration, learnRate,...gradientDecayFactor squaredGradientDecayFactor);%显示训练进度。D =持续时间(0,0,toc(开始),“格式”“hh: mm: ss”);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))%验证网络。如果迭代== 1 || ~hasdata(mbq)%验证预测。[~, lossValidation] = modelPredictions (dlnet、mbqValidation、类);%更新图。drawnow addpoints (lineLossValidation迭代,lossValidation)结束结束结束

测试模型

将验证集上的预测结果与真实标签进行比较,检验模型的分类精度。

使用验证数据进行分类模特预分规函数,列在示例的最后。

dlYPred = modelPredictions (dlnet、mbqValidation、类);YPred = onehotdecode (dlYPred、类1)';

评估分类准确性。

精度=平均值(YPred == YValidation)
精度= 0.9167

使用新数据进行预测

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

reportsNew = [“冷却剂在分拣机下面汇集。”“分类器在启动时烧断保险丝。”“汇编者有一些非常响亮的嘎嘎声的声音。”];

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

documentsNew = preprocessText (reportsNew);dsNew = arrayDatastore (documentsNew,“OutputType”“细胞”);

创建一个minibatchqueue对象,该对象处理和管理小批量数据。为每个mini-batch:

  • 使用自定义小批量预处理功能preprocessMiniBatchPredictors(在本例的最后定义)将文档转换为序列。该预处理功能不需要标签数据。要将单词编码传递给mini-batch,请创建一个只接受一个输入的匿名函数。

  • 使用维度标签格式化预测器“BTC”(批量、时间、通道)。的minibatchqueue默认情况下,对象将数据转换为dlarray具有底层类型的对象

  • 要对所有观测结果进行预测,请返回任何部分小批量。

mbqnew = minibatchqueue(dsnew,...“MiniBatchSize”,小匹马,...“MiniBatchFcn”@ (X) preprocessMiniBatchPredictors (X, enc),...“MiniBatchFormat”“BTC”...“PartialMiniBatch”“返回”);

分类文本数据使用模特预分规函数,并查找得分最高的类。

dlYPred = modelPredictions (dlnet、mbqNew、类);YPred = onehotdecode (dlYPred、类1)”
YPred =3×1分类泄漏电子故障机械故障

文本预处理功能

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

  1. 使用标记文本tokenizedDocument

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

  3. 使用标点符号使用侵蚀

函数文档= preprocessText(TextData)标记文本。文件= tokenizedDocument (textData);%转换为小写。文件=较低(文件);%擦掉标点符号。= erasePunctuation文件(文档);结束

迷你批处理预处理功能

preprocessMiniBatch函数将一小批文档转换为整数序列和一次性编码标签数据。

函数[X, Y] = preprocessMiniBatch(documentsCell,labelsCell,enc)%预处理预测。X = preprocessMiniBatchPredictors (documentsCell enc);%从单元格中提取标签并连接。Y =猫(1,labelsCell{1:结束});%一次性编码标签。Y, Y = onehotencode (2);转置编码标签以匹配网络输出。Y = Y ';结束

小批量预测器预处理功能

preprocessMiniBatchPredictors函数将一小批文档转换为整数序列。

函数X = preprocessMiniBatchPredictors (documentsCell enc)从单元格中提取文档并连接。文件=猫(4,documentsCell{1:结束});%将文档转换为整数序列。X = doc2sequence (enc,文档);X =猫(1,X {:});结束

模型梯度函数

MapicalGRADENTERS.功能需要A.dlnetwork.对象dlnet,迷你批次输入数据dlX具有相应的目标标签T并返回到学习参数的损失梯度dlnet,以及损失。要自动计算梯度,请使用dlgradient函数。

函数[gradient,loss] = modelGradients(dlnet,dlX,T)损失= crossentropy (dlYPred T);梯度= dlgradient(损失、dlnet.Learnables);损失=双(收集(extractdata(损失)));结束

模型的预测函数

模特预分规功能需要A.dlnetwork.对象dlnet,并通过迭代队列中的小批来输出模型预测。为了评估验证数据,当给定一个具有两个输出的迷你批处理队列时,该函数可选地计算损失。

函数(dlYPred,亏损)= modelPredictions (dlnet、兆贝可类)%初始化预测。numClasses =元素个数(类);outputCast = mbq.OutputCast {1};dlYPred = dlarray (0 (numClasses 0 outputCast),“CB”);重置小批队列。重置(兆贝可);%对于有两个输出的小批队列,也计算损失。如果兆贝可。NumOutputs = = 1%循环小批。hasdata(兆贝可)%作出预测。dlX =下一个(兆贝可);海底=预测(dlnet dlX);dlYPred = [dlYPred d];结束其他的%初始化损失。numObservations = 0;损失= 0;%循环小批。hasdata(兆贝可)%作出预测。[DLX,DLT] =下一个(MBQ);海底=预测(dlnet dlX);dlYPred = [dlYPred d];%计算未归一化损失。miniBatchSize =大小(dlX, 2);loss = loss + minbatchsize * cross - sentropy(dlY, dlT);%计数观察。numobservations = numobservations + minibatchsize;结束%正常化的损失。损失=损失/ numobservations;%转换为double。损失=双(收集(extractdata(损失)));结束结束

另请参阅

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

相关的话题