这个例子展示了如何使用卷积神经网络对文本数据进行分类。
要使用卷积对文本数据进行分类,必须将文本数据转换为图像。为此,垫或截断观察结果是否具有恒定长度S.并将文档转换为长度的单词矢量序列C使用单词嵌入。然后,您可以将文档表示为1-by-S.——- - - - - -C图像(高度1,宽度的图像S.,C频道)。
若要将文本数据从CSV文件转换为图像,请创建tabularTextDatastore
对象。转换从tabularTextDatastore
对图像对象进行深度学习的调用变换
使用自定义转换函数。这变换extdata.
函数从数据存储中读取数据并进行预先训练的单词嵌入,并将每个观察结果转换为单词向量数组。
这个例子用不同宽度的一维卷积滤波器训练网络。每个过滤器的宽度对应于过滤器可以看到的单词数(n-gram长度)。该网络具有多个卷积层分支,因此可以使用不同的n-gram长度。
加载预先训练的fastText单词嵌入。此函数需要Text Analytics Toolbox™模型对于FastText英语160亿令牌字嵌入金宝app支持包。如果未安装此支持金宝app包,则该函数提供了下载链接。
emb = fastTextWordEmbedding;
从数据中创建表格文本数据存储factoryreports.csv.
。阅读数据“描述”
和“类别”
只列。
Filenametrain =“factoryReports.csv”;textName =“描述”;labelName =“类别”;ttdstrain = tabulartextdataStore(filenametrain,“SelectedVariableNames”, (textName labelName]);
预览数据存储。
ttdsTrain。ReadSize = 8;预览(ttdsTrain)
ans =8×2表说明类别_______________________________________________________________________ ______________________ {“项目是偶尔卡在扫描器卷轴。”} {'机械故障'} {'响亮的嘎嘎声和敲打声来自瓶子活塞。'} {'机械故障'} {'在开始工厂时有削减到电源。} {'电子失败'} {'汇编程序中的油炸电容器。'} {'电子失败'} {'混音器绊倒了保险丝。'{“电子故障”} {“构造代理中的”突发管道喷洒冷却剂“。} {'泄漏'} {'一个熔丝是在混音器中吹来的。} {'电子失败'} {'事情继续滚动腰带。'} {'机械故障'}
创建自定义转换函数,将从数据存储读取的数据转换为包含预测器和响应的表。这变换extdata.
函数(列在示例的最后)获取从tabularTextDatastore
对象,并返回包含预测器和响应的表。预测因子是1-sequenceLength
——- - - - - -C由单词嵌入给出的单词向量数组胚胎
,在那里C是嵌入的维度。对课程的响应是分类标签一会
。
使用培训数据读取标签readlabels.
函数,在示例的末尾列出,并找到唯一的类名。
Labels = ReadLabels(TTDStrain,LabelName);ClassNames =独特(标签);numobservations = numel(标签);
使用。转换数据存储变换extdata.
函数,并指定序列长度为14。
sequenceLength = 14;tdsTrain = transform(ttdsTrain, @(data) transformTextData(data,sequenceLength,emb,classNames))
UnderlyingDatastore: [1×1 matlab.io.datastore.]TabularTextDatastore] 金宝appSupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parq" "png" "jpg" "jpeg" "tif" "tiff" "wav" "flac" "ogg" "mp4" "m4a"]转换:{@(data)transformTextData(data,sequenceLength,emb,classNames)} IncludeInfo: 0
预览转换后的数据存储。预测因子是1-S.——- - - - - -C阵列,在哪里S.是序列长度和C是特征的数量(嵌入维数)。这些反应就是分类标签。
预览(TDStrain)
ans =8×2表预测器响应_________________ __________________ {1×14×300 single}机械故障{1×14×300 single}机械故障{1×14×300 single}电子故障{1×14×300 single}电子故障{1×14×300 single}电子故障{1×14×300 single}泄漏{1×14×300 single}电子故障{1×14×300 single}机械故障
定义分类任务的网络体系结构。
以下步骤描述了网络架构。
指定输入大小为1-by-S.——- - - - - -C,在那里S.是序列长度和C是特征的数量(嵌入维数)。
对于长度为n-gram的2、3、4和5,创建包含卷积层、批处理归一化层、ReLU层、dropout层和max pooling层的层块。
对于每个块,指定200个大小为1-by-的卷积滤波器N将大小为1-的区域汇聚起来S.,在那里N是n元的长度。
将输入层连接到每个块,并使用深度连接层连接块的输出。
要对输出进行分类,包括一个具有输出大小的全连接层K.、softmax层和分类层,其中K.是课程的数量。
首先,在层数组中,指定输入层、组图的第一个块、深度连接层、完全连接层、softmax层和分类层。
numfeatures = emb.dimension;InputSize = [1个Sequencelength NumFeatures];numfilters = 200;ngramlengths = [2 3 4 5];numblocks = numel(ngramlengths);numclasses = numel(classnames);
创建包含输入层的图层图。将归一化选项设置为“没有”
层名'输入'
。
层= imageInputLayer (inputSize,“归一化”那“没有”那'名称'那'输入');Lgraph = LayerGraph(层);
对于每个n克长度,创建卷积块,批量归一化,relu,丢弃和最大池池层。将每个块连接到输入层。
为了N = ngramlength (j);block =[卷积2dlayer ([1 N],numFilters,'名称'那“conv”+ N,“填充”那“相同”) batchNormalizationLayer ('名称'那“bn”+ N) reluLayer ('名称'那“relu”+ N) dropoutLayer (0.2,'名称'那“下降”+ n)maxpooling2dlayer([1个Sequencelength],'名称'那“最大限度”+ N));lgraph = addLayers (lgraph块);lgraph = connectLayers (lgraph,'输入'那“conv”+ N);结束
在绘图中查看网络架构。
图绘制(3)标题(“网络架构”)
添加深度级联层,完全连接的层,软墨幅层和分类层。
图层= [深度扫描层(numblocks,'名称'那“深度”) fullyConnectedLayer (numClasses'名称'那“俱乐部”) softmaxLayer ('名称'那'柔软的') classificationLayer ('名称'那'分类')];Lgraph = Addlayers(LAGHAGH,层);图绘制(3)标题(“网络架构”)
将最大池层连接到深度连接层,并在绘图中查看最终网络架构。
为了N = ngramlength (j);lgraph = connectLayers (lgraph,“最大限度”+ N,“深度/在”+ j);结束图绘制(3)标题(“网络架构”)
指定培训选项:
迷你批量大小为128的火车。
不要随数据存储而擦拭数据,因为数据存储不是可擦拭的。
显示训练进度图并抑制详细输出。
miniBatchSize = 128;numIterationsPerEpoch =地板(numObservations / miniBatchSize);选择= trainingOptions ('亚当'那......'minibatchsize'miniBatchSize,......“洗牌”那'绝不'那......'plots'那'培训 - 进步'那......“详细”、假);
训练网络使用trainNetwork
功能。
网= trainNetwork (tdsTrain、lgraph选项);
将三个新报告的事件类型分类。创建一个包含新报表的字符串数组。
reportsNew = [“冷却剂在分拣机下面聚集。”“分拣机在启动时烧断保险丝。”“装配器发出了一些非常响亮的咔嗒咔嗒声。”];
使用预处理步骤作为训练文档对文本数据进行预处理。
xnew = preprocesstext(eportsnew,sequencelength,mem);
利用训练好的LSTM网络对新序列进行分类。
labelsnew =分类(net,xnew)
labelsNew =3×1分类泄漏电子故障机械故障
这readlabels.
函数创建副本tabularTextDatastore
目的运输大亨
并从中读取标签labelName.
列。
函数标签= readLabels(ttds,labelName) ttdsNew = copy(ttds);ttdsNew。选择edVariableNames = labelName; tbl = readall(ttdsNew); labels = tbl.(labelName);结束
这变换extdata.
函数获取从tabularTextDatastore
对象,并返回包含预测器和响应的表。预测因子是1-sequenceLength
——- - - - - -C由单词嵌入给出的单词向量数组胚胎
,在那里C是嵌入的维度。对课程的响应是分类标签一会
。
函数dataTransformed = transformTextData(数据、sequenceLength emb一会)%预处理文件。数据textData = {: 1};%prepecess文本dataTransformed = preprocessText (textData、sequenceLength emb);%读取标签。数据标签= {:2};反应=分类(标签、类名);%将数据转换为表。dataTransformed。=反应的反应;结束
这preprocesstextdata.
函数接受文本数据、序列长度和单词嵌入,并执行以下步骤:
在标记文本。
将文本转换为小写。
使用嵌入将文档转换为指定长度的字向量序列。
改变输入到网络中的单词向量序列。
函数tbl = preprocesstext(textdata,sequencelength,mem)文档= tokenizeddocument(textdata);文件=较低(文件);%将文档转换为内嵌按顺序排列的dimension -by- sequenceleng1图像。predictors = doc2sequence(mem,文件,“长度”, sequenceLength);%重塑图像大小为1-ef-sequenceLight-EmbeddingDimension。cellfun(@(X) permute(X,[3 2 1]),predictors,'统一输出'、假);台=表;资源描述。预测=预测;结束
BatchnormalizationLayer.
|convolution2dLayer
|layerGraph
|trainingOptions
|trainNetwork
|变换
|doc2sequence
(文本分析工具箱)|fastTextWordEmbedding
(文本分析工具箱)|tokenizedDocument
(文本分析工具箱)|WordCloud.
(文本分析工具箱)|wordEmbedding
(文本分析工具箱)