主要内容

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

这个例子展示了如何使用带有自定义训练循环的深度学习双向长短期记忆(BiLSTM)网络对文本数据进行分类。

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

属性训练网络对文本数据进行分类基于时间的衰减学习率计划:对于每次迭代,求解器使用 ρ t ρ 0 1 + k t ,在那里t是迭代数, ρ 0 初始学习率,和k就是衰变。

导入数据

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

文件名=“factoryReports.csv”;data = readtable(文件名,TextType=“字符串”);头(数据)
ans =8×5表类别描述紧急解决成本  _____________________________________________________________________ ____________________ ________ ____________________ _____ " 项目是偶尔陷入扫描仪卷。”“机械故障”“中等”“重新调整机”45“装配活塞发出巨大的嘎嘎声和砰砰声。”“机械故障”“中等”“重新调整机器”“开机时电源有故障。”"电子故障" "高" "完全更换" 16200 "装配器电容器烧坏"“电子故障”“高”“更换部件”“352”“混合器熔断器触发。”"电子故障" "低" "列入观察名单" 55 "爆裂管道中施工剂正在喷洒冷却剂""泄漏" "高" "更换部件" 371 "搅拌机保险丝烧断。"“电子故障”“信号低”“更换部件”“东西继续从传送带上掉下来。”"机械故障" "低" "调整机

类中的标签对事件进行分类类别列。要将数据划分为类,请将这些标签转换为类别。

数据。Category = categorical(data.Category);

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

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

下一步是将其划分为用于训练和验证的集。将数据划分为一个训练分区和一个用于验证和测试的预留分区。指定坚持百分比为20%。

cvp = cvpartition(data.Category,Holdout=0.2);dataTrain = data(training(cvp),:);dataValidation = data(test(cvp),:);

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

textDataTrain = dataTrain.Description;textDataValidation = datavalid . description;TTrain = dataTrain.Category;TValidation = datavalid . category;

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

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

查看类的个数。

类=类别(TTrain);numClasses = numel(类)
numClasses = 4

预处理文本数据

创建一个对文本数据进行标记和预处理的函数。这个函数preprocessText,在示例末尾列出,执行以下步骤:

  1. 使用标记化文本tokenizedDocument

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

  3. 删除标点符号erasePunctuation

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

documentsTrain = preprocessText(textDataTrain);documentsValidation = preprocessText(textDataValidation);

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

documentsTrain (1:5)
ans = 5×1 tokenizedDocument: 9令牌:项目偶尔卡在扫描仪线轴10令牌:响亮的嘎嘎声和砰砰声来自组装活塞5令牌:在组装机炸电容器4令牌:搅拌机绊倒保险丝9令牌:爆裂的管道在施工代理正在喷射冷却剂

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

dsDocumentsTrain = arrayDatastore(documentsTrain,OutputType=“细胞”);dsTTrain = arrayDatastore(TTrain,OutputType=“细胞”);dsTrain = combine(dsDocumentsTrain,dsTTrain);

为验证文档创建一个数组数据存储。

dsDocumentsValidation = arrayDatastore(documentsValidation,OutputType=“细胞”);

创建文字编码

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

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

enc = worddencoding (documentsTrain)
词汇:["项目" "是" "偶尔" "得到" "卡" "在" " "扫描仪" "线轴" "大声" "嘎嘎" "和"砰砰" "声音" "来" "从" "汇编" "活塞" "炸"…]

定义网络

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

inputSize = 1;embeddingDimension = 25;numHiddenUnits = 40;numWords = c. numWords;layers = [sequenceInputLayer(inputSize) wordEmbeddingLayer(embeddingDimension,numWords) bilstmLayer(numHiddenUnits,OutputMode= .“最后一次”fullyConnectedLayer(numClasses) softmaxLayer
2”字嵌入层字嵌入层25维和417个唯一单词3”BiLSTM BiLSTM与40个隐藏单元4”全连接4全连接层5”Softmax Softmax

将图层数组转换为adlnetwork对象。

Net = dlnetwork(layers)
net = dlnetwork with properties: Layers: [5×1 nnet.cnn.layer.Layer] Connections: [4×2 table] Learnables: [6×3 table] State: [2×3 table] InputNames: {'sequenceinput'} OutputNames: {'softmax'} Initialized: 1 .初始化

定义模型损失函数

创建函数modelLoss,列在示例末尾,它需要adlnetwork对象,一个带有相应标签的小批量输入数据,并返回损失和损失相对于网络中可学习参数的梯度。

指定培训项目

训练30个epoch,小批量大小为16个。

numEpochs = 30;miniBatchSize = 16;

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

initialLearnRate = 0.001;衰减= 0.01;gradientDecayFactor = 0.9;squaredGradientDecayFactor = 0.999;

火车模型

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

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

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

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

mbq = minibatchqueue(dsTrain,...MiniBatchSize = MiniBatchSize,...MiniBatchFcn = @ (X, T) preprocessMiniBatch (X, T, enc),...MiniBatchFormat = [“BTC”""]);

创建一个minibatchqueue对象用于验证文档。对于每个小批量:

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

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

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

mbqValidation = minibatchqueue(dsDocumentsValidation,...MiniBatchSize = MiniBatchSize,...MiniBatchFcn = @ (X) preprocessMiniBatchPredictors (X, enc),...MiniBatchFormat =“BTC”...PartialMiniBatch =“回归”);

为了便于计算验证损失,将验证标签转换为单热编码向量,并将编码标签转置以匹配网络输出格式。

TValidation = onehotencode(TValidation,2);TValidation = TValidation';

初始化培训进度图。

图C = colororder;lineLossTrain = animatedline(Color=C(2,:));lineLossValidation = animatedline(...线型=”——“...标志=“o”...MarkerFaceColor =“黑色”);Ylim ([0 inf]) xlabel(“迭代”) ylabel (“损失”网格)

初始化Adam的参数。

trailingAvg = [];trailingAvgSq = [];

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

对于每个小批量:

  • 将文档转换为整数序列,并对标签进行one-hot编码。

  • 将数据转换为dlarray具有底层类型single的对象,并指定维度标签“BTC”(批次,时间,通道)。

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

  • 评估模型损失和梯度使用dlfevalmodelLoss函数。

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

  • 方法更新网络参数adamupdate函数。

  • 更新训练图。

迭代= 0;开始= tic;%遍历epoch。epoch = 1:numEpochs% Shuffle数据。洗牌(兆贝可);在小批上循环。Hasdata (mbq)迭代=迭代+ 1;读取小批数据。[X,T] = next(mbq);计算模型损失和梯度使用dlfeval和% modelLoss函数。[loss,gradients] = dlfeval(@modelLoss,net,X,T);确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);使用Adam优化器更新网络参数。。[net,trailingAvg,trailingAvgSq] = adamupdate(net, gradients,...trailingAvg, trailingAvgSq,迭代,learnRate,...gradientDecayFactor squaredGradientDecayFactor);%显示培训进度。D = duration(0,0,toc(start),Format=“hh: mm: ss”);损失=双倍(损失);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+ epoch +,消失:"+字符串(D))现在绘制%验证网络。如果迭代== 1 || ~hasdata(mbq) [~,scoresValidation] = modelPredictions(net,mbqValidation,classes);lossValidation = crossentropy(scoresValidation,TValidation);%更新绘图。lossValidation = double(lossValidation);drawnow addpoints (lineLossValidation迭代,lossValidation)结束结束结束

测试模型

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

对验证数据进行分类modelPredictions函数,在示例末尾列出。

YNew = modelforecasts (net,mbqValidation,classes);

为了便于计算验证精度,将单热编码验证标签转换为分类和转置。

TValidation = onehotdecode(TValidation,classes,1)';

评估分类准确率。

accuracy = mean(YNew == TValidation)
准确度= 0.8854

使用新数据进行预测

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

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

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

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

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

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

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

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

mbqNew = minibatchqueue(dsNew,...MiniBatchSize = MiniBatchSize,...MiniBatchFcn = @ (X) preprocessMiniBatchPredictors (X, enc),...MiniBatchFormat =“BTC”...PartialMiniBatch =“回归”);

对文本数据进行分类modelPredictions函数,在示例的末尾列出,并找到得分最高的类。

YNew = modelforecasts (net,mbqNew,classes)
YNew =3×1分类泄漏电子故障机械故障

金宝app支持功能

文本预处理功能

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

  1. 使用标记化文本tokenizedDocument

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

  3. 删除标点符号erasePunctuation

函数documents = preprocessText(textData)标记文本。documents = tokenizedDocument(textData);%转换为小写字母。文档=较低(文档);删除标点符号。documents = eraspunctuation(文档);结束

小批量预处理功能

preprocessMiniBatch函数将小批量文档转换为整数序列,并对标签数据进行one-hot编码。

函数[X,T] = preprocessMiniBatch(dataX,dataT,enc)预处理预测器。X = preprocessMiniBatchPredictors(dataX,enc);从单元格和级联中提取标签。T = cat(1,dataT{1:end});单热编码标签。T = onehotencode(T,2);转置编码标签以匹配网络输出。T = T';结束

小批量预测预处理函数

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

函数X = preprocessMiniBatchPredictors(dataX,enc)从单元格和连接中提取文档。documents = cat(4,dataX{1:end});将文档转换为整数序列。X = doc2sequence(enc,documents);X = cat(1,X{:});结束

模型损失函数

modelLoss函数的参数为dlnetwork对象,一小批输入数据X有相应的目标标签T并返回损失相对于中可学习参数的梯度,以及损失。要自动计算梯度,请使用dlgradient函数。

函数[loss,gradients] = modelLoss(net,X,T) Y = forward(net,X);损失=交叉熵(Y,T);gradients = dlgradient(loss,net.Learnables);结束

模型预测函数

modelPredictions函数的参数为dlnetwork对象为一个小批队列,通过迭代队列中的小批,输出模型预测值和分数。

函数[预测,分数]= modelforecasts(净,mbq,类)初始化预测。预测= [];分数= [];重置迷你批处理队列。重置(兆贝可);在小批上循环。hasdata(兆贝可)做预测。X = next(mbq);Y =预测(净,X);分数=[分数Y];Y = onehotdecode(Y,classes,1)';预测=[预测;Y);结束结束

另请参阅

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

相关的话题