Классифицируйте текстовые данные из памяти Используя глубокое обучение

В этом примере показано, как классифицировать текстовые данные из памяти с нейронной сетью для глубокого обучения с помощью преобразованного datastore.

Преобразованный datastore преобразовывает или данные о процессах, считанные из базового datastore. Можно использовать преобразованный datastore в качестве источника обучения, валидации, теста и наборов данных предсказания для применения глубокого обучения. Используйте преобразованные хранилища данных, чтобы считать данные, которые не помещаются в память, или выполнить определенные операции предварительной обработки при чтении пакетов данных.

При обучении сети программное обеспечение создает мини-пакеты последовательностей той же длины путем дополнения, обрезая или разделяя входные данные. trainingOptions функция предоставляет возможности заполнять и обрезать входные последовательности, однако, эти опции не хорошо подходят для последовательностей векторов слова. Кроме того, эта функция не поддерживает дополнительные данные в пользовательском datastore. Вместо этого необходимо заполнить и обрезать последовательности вручную. Если вы лево-заполняете и обрезаете последовательности векторов слова, то учебная сила улучшается.

Классифицировать текстовые Данные Используя Глубокое обучение (Text Analytics Toolbox) пример вручную обрезает и заполняет все документы той же длине. Этот процесс добавляет большое дополнение к очень коротким документам и отбрасывает много данных из очень длинных документов.

В качестве альтернативы, чтобы предотвратить добавление слишком большого дополнения или отбрасывание слишком большого количества данных, создайте преобразованный datastore, который вводит мини-пакеты в сеть. Datastore, созданный в этом примере, преобразует мини-пакеты документов последовательностям или словарей и лево-заполняет каждый мини-пакет к длине самого длинного документа в мини-пакете.

Загрузите предварительно обученный Word Embedding

Datastore требует, чтобы встраивание слова преобразовало документы последовательностям векторов. Загрузите предварительно обученное встраивание слова с помощью fastTextWordEmbedding. Эта функция требует Модели Text Analytics Toolbox™ для fastText английских 16 миллиардов Лексем пакет поддержки Word Embedding. Если этот пакет поддержки не установлен, то функция обеспечивает ссылку на загрузку.

emb = fastTextWordEmbedding;

Загрузка данных

Создайте табличный текстовый datastore из данных в factoryReports.csv. Задайте, чтобы считать данные из "Description" и "Category" столбцы только.

filenameTrain = "factoryReports.csv";
textName = "Description";
labelName = "Category";
ttdsTrain = tabularTextDatastore(filenameTrain,'SelectedVariableNames',[textName labelName]);

Просмотрите предварительный просмотр datastore.

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'}

Преобразуйте Datastore

Создайте пользовательское, преобразовывают функцию, которая преобразует данные, считанные от datastore до таблицы, содержащей предикторы и ответы. transformText функционируйте берет данные, считанные из tabularTextDatastore возразите и возвращает таблицу предикторов и ответов. Предикторы являются C-by-S массивами векторов слова, данных словом, встраивающим emb, где C является размерностью встраивания, и S является длиной последовательности. Ответы являются категориальными метками по классам.

Чтобы получить имена классов, считайте метки из обучающих данных с помощью readLabels функция, перечисленная и конец примера, и, находит уникальные имена классов.

labels = readLabels(ttdsTrain,labelName);
classNames = unique(labels);
numObservations = numel(labels);

Поскольку табличные текстовые хранилища данных могут считать несколько строк данных в одном чтении, можно обработать полный мини-пакет данных в функции преобразования. Чтобы гарантировать, что функция преобразования обрабатывает полный мини-пакет данных, устанавливает размер чтения табличного текстового datastore к мини-пакетному размеру, который будет использоваться в обучении.

miniBatchSize = 64;
ttdsTrain.ReadSize = miniBatchSize;

Чтобы преобразовать выход табличных текстовых данных к последовательностям для обучения, преобразуйте datastore с помощью transform функция.

tdsTrain = transform(ttdsTrain, @(data) transformText(data,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)transformText(data,emb,classNames)}
               IncludeInfo: 0

Предварительный просмотр преобразованного datastore. Предикторы являются C-by-S массивами, где S является длиной последовательности, и C является количеством функций (размерность встраивания). Ответы являются категориальными метками.

preview(tdsTrain)
ans=8×2 table
      predictors           responses     
    _______________    __________________

    {300×11 single}    Mechanical Failure
    {300×11 single}    Mechanical Failure
    {300×11 single}    Electronic Failure
    {300×11 single}    Electronic Failure
    {300×11 single}    Electronic Failure
    {300×11 single}    Leak              
    {300×11 single}    Electronic Failure
    {300×11 single}    Mechanical Failure

Создайте и обучите сеть LSTM

Задайте архитектуру сети LSTM. Чтобы ввести данные о последовательности в сеть, включайте входной слой последовательности и установите входной размер на размерность встраивания. Затем включайте слой LSTM с 180 скрытыми модулями. Чтобы использовать слой LSTM в проблеме классификации последовательностей к метке, установите режим вывода на 'last'. Наконец, добавьте полносвязный слой с выходным размером, равным количеству классов, softmax слоя и слоя классификации.

numFeatures = emb.Dimension;
numHiddenUnits = 180;
numClasses = numel(classNames);
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Задайте опции обучения. Задайте решатель, чтобы быть 'adam' и порог градиента, чтобы быть 2. Datastore не поддерживает перестановку, таким образом, устанавливает 'Shuffle', к 'never'. Подтвердите сеть однажды в эпоху. Чтобы контролировать процесс обучения, установите 'Plots' опция к 'training-progress'. Чтобы подавить многословный выход, установите 'Verbose' к false.

По умолчанию, trainNetwork использует графический процессор, если вы доступны (требует Parallel Computing Toolbox™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше). В противном случае это использует центральный процессор. Чтобы задать среду выполнения вручную, используйте 'ExecutionEnvironment' аргумент пары "имя-значение" trainingOptions. Обучение на центральном процессоре может взять значительно дольше, чем обучение на графическом процессоре.

numIterationsPerEpoch = floor(numObservations / miniBatchSize);

options = trainingOptions('adam', ...
    'MaxEpochs',15, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',2, ...
    'Shuffle','never', ...
    'Plots','training-progress', ...
    'Verbose',false);

Обучите сеть LSTM с помощью trainNetwork функция.

net = trainNetwork(tdsTrain,layers,options);

Предскажите Используя новые данные

Классифицируйте тип события трех новых отчетов. Создайте массив строк, содержащий новые отчеты.

reportsNew = [ ...
    "Coolant is pooling underneath sorter."
    "Sorter blows fuses at start up."
    "There are some very loud rattling sounds coming from the assembler."];

Предварительно обработайте текстовые данные с помощью шагов предварительной обработки в качестве учебных материалов.

documentsNew = preprocessText(reportsNew);

Преобразуйте текстовые данные в последовательности встраивания векторов с помощью doc2sequence.

XNew = doc2sequence(emb,documentsNew);

Классифицируйте новые последовательности с помощью обученной сети LSTM.

labelsNew = classify(net,XNew)
labelsNew = 3×1 categorical
     Leak 
     Electronic Failure 
     Mechanical Failure 

Преобразуйте текстовую функцию

transformText функционируйте берет данные, считанные из tabularTextDatastore возразите и возвращает таблицу предикторов и ответов. Предикторы являются C-by-S массивами векторов слова, данных словом, встраивающим emb, где C является размерностью встраивания, и S является длиной последовательности. Ответы являются категориальными метками по классам в classNames.

function dataTransformed = transformText(data,emb,classNames)

% Preprocess documents.
textData = data{:,1};
documents = preprocessText(textData);

% Convert to sequences.
predictors = doc2sequence(emb,documents);

% Read labels.
labels = data{:,2};
responses = categorical(labels,classNames);

% Convert data to table.
dataTransformed = table(predictors,responses);

end

Предварительная обработка функции

Функциональный preprocessText выполняет эти шаги:

  1. Маркируйте текст с помощью tokenizedDocument.

  2. Преобразуйте текст в нижний регистр с помощью lower.

  3. Сотрите пунктуацию с помощью erasePunctuation.

function documents = preprocessText(textData)

documents = tokenizedDocument(textData);
documents = lower(documents);
documents = erasePunctuation(documents);

end

Считайте функцию меток

readLabels функция создает копию tabularTextDatastore объект ttds и читает метки из labelName столбец.

function labels = readLabels(ttds,labelName)

ttdsNew = copy(ttds);
ttdsNew.SelectedVariableNames = labelName;
tbl = readall(ttdsNew);
labels = tbl.(labelName);

end

Смотрите также

| | | | | | | |

Похожие темы