此示例显示如何使用具有自定义训练循环的深度学习双向短期内存(Bilstm)网络对文本数据进行分类。
使用使用的深度学习网络时trainNetwork
功能,如果trainingOptions
不提供您需要的选项(例如,自定义学习速率计划),那么您可以使用自动区分定义您自己的自定义训练循环。的示例,展示了如何使用trainNetwork
功能,请参阅使用深度学习对文本数据进行分类(深度学习工具箱).
这个例子训练一个网络用基于时间的衰减学习率计划:对于每次迭代,求解器使用给定的学习率 ,在那里t为迭代数, 是初始学习率,和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
,执行以下步骤:
使用标记文本tokenizedDocument
.
将文本转换为小写字母使用较低的
.
使用标点符号使用侵蚀
.
对训练数据和验证数据进行预处理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
对象。
评估模型梯度、状态和损失使用dlfeval
和MapicalGRADENTERS.
函数,并更新网络状态。
确定基于时间的衰变学习率计划的学习率。
使用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
执行以下步骤:
使用标记文本tokenizedDocument
.
将文本转换为小写字母使用较低的
.
使用标点符号使用侵蚀
.
函数文档= 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(损失)));结束结束
wordEmbeddingLayer
|tokenizedDocument
|lstmlayer.
(深度学习工具箱)|doc2sequence
|sequenceInputLayer
(深度学习工具箱)|wordcloud
|dlfeval
(深度学习工具箱)|dlgradient
(深度学习工具箱)|dlarray
(深度学习工具箱)