这个例子展示了如何使用卷积神经网络对文本数据进行分类。
要使用卷积对文本数据进行分类,必须将文本数据转换为图像。要做到这一点,填充或截断观测值使其具有恒定的长度年代并将文档转换为长度的单词向量序列C使用单词嵌入。然后您可以将文档表示为1-by-年代-借-C图像(高度为1,宽度为1的图像年代,C渠道)。
要将CSV文件中的文本数据转换为图像,请创建tabularTextDatastore
对象。转换从tabularTextDatastore
对象到图像的深度学习通过调用变换
具有自定义转换函数transformTextData
函数(列在示例末尾)获取从数据存储和预训练单词嵌入中读取的数据,并将每个观察值转换为单词向量数组。
此示例使用不同宽度的一维卷积滤波器训练网络。每个滤波器的宽度对应于滤波器可以看到的字数(n-gram长度)。该网络具有卷积层的多个分支,因此可以使用不同的n-gram长度。
加载预先训练的fastText单词嵌入。此功能需要文本分析工具箱™模型用于快速文本英语160亿令牌词嵌入金宝app支持包。如果没有安装此支金宝app持包,则该函数将提供下载链接。
emb=fastTextWordEmbedding;
从中的数据创建一个表格文本数据存储factoryReports.csv
.读取数据“描述”
和“类别”
仅列。
filenameTrain =“factoryReports.csv”;文本名称=“描述”;标签名=“类别”;ttdsTrain = tabularTextDatastore (filenameTrain,“SelectedVariableNames”,[textName labelName]);
预览数据存储。
ttdsTrain.ReadSize=8;预览(ttdsTrain)
ans=8×2表类别描述 _______________________________________________________________________ ______________________ {' 项目是偶尔陷于扫描器线轴。机械故障装配工的活塞发出响亮的咔哒咔哒声和砰砰声。{'机械故障' '启动工厂时电源被切断了。' '电子故障' ' '汇编器中的电容器损坏。' '电子故障' '混频器跳闸保险丝。{' '电子故障' '}' '施工剂喷淋冷却剂的管道爆裂。{'漏'{'混合器里的保险丝烧断了。{' '电子故障' ' '东西继续从传送带上滚下来。{'机械故障'}
创建自定义转换函数,将从数据存储读取的数据转换为包含预测器和响应的表。的transformTextData
函数(在示例末尾列出)获取从tabularTextDatastore
对象,并返回预测值和响应的表。预测值为1-x-序列长度
-借-C由单词嵌入给出的单词向量数组循证
哪里C为嵌入维数。中的类的响应是分类标签类名
.
使用标签读取训练数据中的标签readLabels
函数,并查找唯一的类名。
标签= readLabels (ttdsTrain labelName);一会=独特(标签);numObservations =元素个数(标签);
使用transformTextData
函数并指定序列长度为14。
sequenceLength = 14;tdsTrain = transform(ttdsTrain, @(data) transformTextData(data,sequenceLength,emb,classNames))
tdsTrain = TransformedDatastore属性:UnderlyingDatastore:TabularTextDatastore] 金宝appSupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parquet" "parq" "png" "jpg" "jpeg" "tif" "tiff" "wav" "flac" "ogg" "mp4" "m4a"] Transforms:{@(数据)transformTextData(data,sequenceLength,emb,classNames)} IncludeInfo: 0
预览转换后的数据存储。预测值为1-x-年代-借-C数组,年代是序列的长度和长度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-年代-借-C哪里年代是序列的长度和长度C为特征个数(嵌入维数)。
对于长度为n-gram的2、3、4和5,创建包含卷积层、批处理正常化层、ReLU层、dropout层和max pooling层的层块。
对于每个块,指定大小为1 × -的200个卷积滤波器N以及大小为1 × -的区域池年代哪里N是n克长度。
将输入层连接到每个块,并使用深度连接层连接块的输出。
要对输出进行分类,请包括具有输出大小的完全连接层K、softmax层和分类层,其中K为类数。
首先,在层数组中,指定输入层、Unigram的第一个块、深度连接层、完全连接层、softmax层和分类层。
numFeatures=有效尺寸;inputSize=[1 sequenceLength numFeatures];numFilters=200;ngramlength=[2 3 4 5];numBlocks=numel(NgramLength);numClasses=numel(类名);
创建一个包含输入层的层图。将规范化选项设置为“没有”
以及要添加的图层名称“输入”
.
图层=imageInputLayer(inputSize,“正常化”,“没有”,“名字”,“输入”);lgraph = layerGraph(层);
对于每个n-gram长度,创建一个由卷积、批处理归一化、ReLU、dropout和max pooling层组成的块。将每个块连接到输入层。
对于j=1:numBlocks N=ngramlength(j);block=[卷积2dlayer([1 N],numFilters,“名字”,“conv”+N,,“填充”,“相同”)批处理规范化层(“名字”,“bn”+N) 雷卢耶(“名字”,“relu”+N) dropoutLayer(0.2,“名字”,“下降”+ N) maxPooling2dLayer ([1 sequenceLength],“名字”,“马克斯”+N) ];lgraph=addLayers(lgraph,block);lgraph=connectLayers(lgraph,“输入”,“conv”+ N);终止
在图中查看网络结构。
图绘制(lgraph)标题(“网络架构”)
添加深度级联层、全连接层、softmax层和分类层。
层=[depthConcatenationLayer(numBlocks,“名字”,“深度”) fullyConnectedLayer (numClasses“名字”,“俱乐部”)软MaxLayer(“名字”,“软”) classificationLayer (“名字”,“分类”));lgraph = addLayers (lgraph层);图绘制(lgraph)标题(“网络架构”)
将最大池化层连接到深度级联层,并在图中查看最终的网络架构。
对于j = 1:numBlocks N = ngramlength (j);lgraph = connectLayers (lgraph,“马克斯”+N,,“深度/”+j) );终止图绘制(lgraph)标题(“网络架构”)
指定培训选项:
用128的小批量训练。
不要打乱数据,因为数据存储是不可打乱的。
显示训练进度图并抑制详细输出。
miniBatchSize=128;numIterationsPerEpoch=floor(婚礼服务/miniBatchSize);options=trainingOptions(“亚当”,...“MiniBatchSize”,小批量,...“洗牌”,“永远”,...“阴谋”,“训练进步”,...“冗长”、假);
训练网络使用列车网络
作用
net=列车网络(TDSTREANT、LGRAPHE、选项);
对三个新报告的事件类型进行分类。创建包含新报告的字符串数组。
reportsNew = [“冷却液在分拣机下方聚集。”“分类器在启动时烧断保险丝。”“从组装器里传出很响的咔哒声。”];
使用预处理步骤作为训练文档对文本数据进行预处理。
XNew = preprocessText (reportsNew、sequenceLength emb);
用训练好的LSTM网络对新的序列进行分类。
XNew labelsNew =分类(净)
新标签=3×1范畴泄漏电子故障机械故障
的readLabels
函数创建tabularTextDatastore
对象ttds
读标签labelName
柱
函数labels=readLabels(ttds,labelName)ttdsNew=copy(ttds);ttdsNew.SelectedVariableNames=labelName;tbl=readall(ttdsNew);labels=tbl.(labelName);终止
的transformTextData
函数接受从对象读取的数据tabularTextDatastore
对象,并返回预测值和响应的表。预测值为1-x-序列长度
-借-C由单词嵌入给出的单词向量数组循证
哪里C为嵌入维数。中的类的响应是分类标签类名
.
函数dataTransformed=transformTextData(数据、序列长度、emb、类名)%预处理文档。textData=数据{,1};% Prepocess文本dataTransformed = preprocessText (textData、sequenceLength emb);%阅读标签。标签=数据{:,2};响应=分类(标签,类名);%将数据转换为表。dataTransformed.Responses=响应;终止
的preprocessTextData
函数获取文本数据、序列长度和单词嵌入,并执行以下步骤:
标记文本。
将文本转换为小写。
使用嵌入将文档转换为指定长度的字向量序列。
重塑输入到网络中的字向量序列。
函数tbl = preprocessText(textData,sequenceLength,emb) documents = tokenizedDocument(textData);文件=低(文件);%将文档转换为嵌入尺寸按序列长度按1的图像。预测= doc2sequence (emb、文档“长度”, sequenceLength);%重塑图像大小为1-by sequencelength - embedingdimension。预测值=cellfun(@(X)排列(X,[3 2 1]),预测值,“UniformOutput”、假);台=表;资源描述。预测=预测;终止
fastTextWordEmbedding
(文本分析工具箱)|wordcloud
(文本分析工具箱)|wordEmbedding
(文本分析工具箱)|layerGraph
|convolution2dLayer
|batchNormalizationLayer
|trainingOptions
|列车网络
|DOC2序列
(文本分析工具箱)|tokenizedDocument
(文本分析工具箱)|变换