В этом примере показано, как классифицировать текстовые данные с помощью сверточной нейронной сети.
Чтобы классифицировать текстовые данные с помощью сверток, необходимо преобразовать текстовые данные в изображения. Для этого поместите или усечите наблюдения, чтобы они имели постоянную длину S, и преобразуйте документы в последовательности векторов слов длиной C, используя вложение слов. Затем можно представить документ в виде 1-by-S-by-C изображения (изображение с высотой 1, шириной S и C каналов).
Чтобы преобразовать текстовые данные из CSV-файла в изображения, создайте tabularTextDatastore объект. Преобразование данных, считанных из tabularTextDatastore объект к изображениям для глубокого обучения путем вызова transform с пользовательской функцией преобразования. transformTextData функция, перечисленная в конце примера, берет данные, считанные из хранилища данных, и предварительно подготовленное вложение слов и преобразует каждое наблюдение в массив векторов слов.
В этом примере обучается сеть с 1-D сверточными фильтрами различной ширины. Ширина каждого фильтра соответствует количеству слов, которые может видеть фильтр (длина n-грамма). Сеть имеет несколько ветвей сверточных слоев, поэтому она может использовать разные n-граммовые длины.
Загрузите предварительно подготовленное вложение слова fastText. Для выполнения этой функции требуется модель Text Analytics Toolbox™ для пакета поддержки внедрения Token Word на английском языке на 16 миллиардов. Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки.
emb = fastTextWordEmbedding;
Создание хранилища табличных текстовых данных из данных в factoryReports.csv. Считывание данных из "Description" и "Category" только столбцы.
filenameTrain = "factoryReports.csv"; textName = "Description"; labelName = "Category"; ttdsTrain = tabularTextDatastore(filenameTrain,'SelectedVariableNames',[textName labelName]);
Предварительный просмотр хранилища данных.
ttdsTrain.ReadSize = 8; preview(ttdsTrain)
ans=8×2 table
Description Category
_______________________________________________________________________ ______________________
{'Items are occasionally getting stuck in the scanner spools.' } {'Mechanical Failure'}
{'Loud rattling and banging sounds are coming from assembler pistons.'} {'Mechanical Failure'}
{'There are cuts to the power when starting the plant.' } {'Electronic Failure'}
{'Fried capacitors in the assembler.' } {'Electronic Failure'}
{'Mixer tripped the fuses.' } {'Electronic Failure'}
{'Burst pipe in the constructing agent is spraying coolant.' } {'Leak' }
{'A fuse is blown in the mixer.' } {'Electronic Failure'}
{'Things continue to tumble off of the belt.' } {'Mechanical Failure'}
Создайте пользовательскую функцию преобразования, которая преобразует данные, считанные из хранилища данных, в таблицу, содержащую предикторы и ответы. transformTextData функция, перечисленная в конце примера, берет данные, считанные из tabularTextDatastore и возвращает таблицу предикторов и ответов. Предикторы 1-by-sequenceLength-by-C-массивы векторов слов, задаваемые вложением слов emb, где C - размер встраивания. Ответы являются категориальными метками над классами в classNames.
Считывание меток из данных обучения с помощью readLabels и найдите уникальные имена классов.
labels = readLabels(ttdsTrain,labelName); classNames = unique(labels); numObservations = numel(labels);
Преобразование хранилища данных с помощью transformTextData и укажите длину последовательности, равную 14.
sequenceLength = 14; tdsTrain = transform(ttdsTrain, @(data) transformTextData(data,sequenceLength,emb,classNames))
tdsTrain =
TransformedDatastore with properties:
UnderlyingDatastore: [1×1 matlab.io.datastore.TabularTextDatastore]
SupportedOutputFormats: ["txt" "csv" "xlsx" "xls" "parquet" "parq" "png" "jpg" "jpeg" "tif" "tiff" "wav" "flac" "ogg" "mp4" "m4a"]
Transforms: {@(data)transformTextData(data,sequenceLength,emb,classNames)}
IncludeInfo: 0
Предварительный просмотр преобразованного хранилища данных. Предикторами являются 1-by-S-by-C массива, где S - длина последовательности, а C - количество признаков (размерность внедрения). Ответы являются категориальными метками.
preview(tdsTrain)
ans=8×2 table
Predictors Responses
_________________ __________________
{1×14×300 single} Mechanical Failure
{1×14×300 single} Mechanical Failure
{1×14×300 single} Electronic Failure
{1×14×300 single} Electronic Failure
{1×14×300 single} Electronic Failure
{1×14×300 single} Leak
{1×14×300 single} Electronic Failure
{1×14×300 single} Mechanical Failure
Определите архитектуру сети для задачи классификации.
Ниже описана архитектура сети.
Укажите входной размер 1-by-S-by-C, где S - длина последовательности, а C - количество элементов (размер встраивания).
Для n-граммовых длин 2, 3, 4 и 5 создайте блоки слоев, содержащих сверточный слой, слой нормализации пакета, слой ReLU, слой отсева и слой максимального объединения.
Для каждого блока укажите 200 сверточных фильтров размера 1-by-N и областей объединения размера 1-by-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);
Создайте график слоев, содержащий входной слой. Задайте для опции нормализации значение 'none' и имя слоя для 'input'.
layer = imageInputLayer(inputSize,'Normalization','none','Name','input'); lgraph = layerGraph(layer);
Для каждого из n-граммовых уровней создайте блок свертки, пакетной нормализации, ReLU, отсева и максимального объединения. Подключите каждый блок к входному слою.
for j = 1:numBlocks N = ngramLengths(j); block = [ convolution2dLayer([1 N],numFilters,'Name',"conv"+N,'Padding','same') batchNormalizationLayer('Name',"bn"+N) reluLayer('Name',"relu"+N) dropoutLayer(0.2,'Name',"drop"+N) maxPooling2dLayer([1 sequenceLength],'Name',"max"+N)]; lgraph = addLayers(lgraph,block); lgraph = connectLayers(lgraph,'input',"conv"+N); end
Просмотр сетевой архитектуры на графике.
figure
plot(lgraph)
title("Network Architecture")
Добавьте слой конкатенации глубины, полностью соединенный слой, слой softmax и классификационный слой.
layers = [
depthConcatenationLayer(numBlocks,'Name','depth')
fullyConnectedLayer(numClasses,'Name','fc')
softmaxLayer('Name','soft')
classificationLayer('Name','classification')];
lgraph = addLayers(lgraph,layers);
figure
plot(lgraph)
title("Network Architecture")
Подключите максимальные уровни объединения к слою конкатенации глубины и просмотрите окончательную сетевую архитектуру на графике.
for j = 1:numBlocks N = ngramLengths(j); lgraph = connectLayers(lgraph,"max"+N,"depth/in"+j); end figure plot(lgraph) title("Network Architecture")

Укажите параметры обучения:
Поезд с размером мини-партии 128.
Не тасуйте данные, так как хранилище данных не может тасоваться.
Отображение графика хода обучения и подавление подробных выходных данных.
miniBatchSize = 128; numIterationsPerEpoch = floor(numObservations/miniBatchSize); options = trainingOptions('adam', ... 'MiniBatchSize',miniBatchSize, ... 'Shuffle','never', ... 'Plots','training-progress', ... 'Verbose',false);
Обучение сети с помощью trainNetwork функция.
net = trainNetwork(tdsTrain,lgraph,options);

Классифицируйте тип события для трех новых отчетов. Создайте строковый массив, содержащий новые отчеты.
reportsNew = [
"Coolant is pooling underneath sorter."
"Sorter blows fuses at start up."
"There are some very loud rattling sounds coming from the assembler."];Предварительная обработка текстовых данных с использованием шагов предварительной обработки в качестве учебных документов.
XNew = preprocessText(reportsNew,sequenceLength,emb);
Классифицируйте новые последовательности с помощью обученной сети LSTM.
labelsNew = classify(net,XNew)
labelsNew = 3×1 categorical
Leak
Electronic Failure
Mechanical Failure
readLabels создает копию tabularTextDatastore объект ttds и считывает метки из labelName столбец.
function labels = readLabels(ttds,labelName) ttdsNew = copy(ttds); ttdsNew.SelectedVariableNames = labelName; tbl = readall(ttdsNew); labels = tbl.(labelName); end
transformTextData функция принимает данные, считанные из tabularTextDatastore и возвращает таблицу предикторов и ответов. Предикторы 1-by-sequenceLength-by-C-массивы векторов слов, задаваемые вложением слов emb, где C - размер встраивания. Ответы являются категориальными метками над классами в classNames.
function dataTransformed = transformTextData(data,sequenceLength,emb,classNames) % Preprocess documents. textData = data{:,1}; % Prepocess text dataTransformed = preprocessText(textData,sequenceLength,emb); % Read labels. labels = data{:,2}; responses = categorical(labels,classNames); % Convert data to table. dataTransformed.Responses = responses; end
preprocessTextData функция принимает текстовые данные, длину последовательности и встраивание слов и выполняет следующие шаги:
Выполните маркировку текста.
Преобразование текста в нижний регистр.
Преобразует документы в последовательности векторов слов заданной длины с помощью встраивания.
Изменение формы векторных последовательностей слов для ввода в сеть.
function tbl = preprocessText(textData,sequenceLength,emb) documents = tokenizedDocument(textData); documents = lower(documents); % Convert documents to embeddingDimension-by-sequenceLength-by-1 images. predictors = doc2sequence(emb,documents,'Length',sequenceLength); % Reshape images to be of size 1-by-sequenceLength-embeddingDimension. predictors = cellfun(@(X) permute(X,[3 2 1]),predictors,'UniformOutput',false); tbl = table; tbl.Predictors = predictors; end
batchNormalizationLayer | convolution2dLayer | layerGraph | trainingOptions | trainNetwork | transform | doc2sequence (инструментарий для анализа текста) | fastTextWordEmbedding(Панель инструментов для анализа текста) | tokenizedDocument(Панель инструментов для анализа текста) | wordcloud(Панель инструментов для анализа текста) | wordEmbedding(Панель инструментов для анализа текста)