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

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

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

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

Пример «Классификация текстовых данных с использованием глубокого обучения» (Symbolic Math Toolbox) вручную обрезает и заполняет все документы той же длиной. Этот процесс добавляет много заполнения к очень коротким документам и отбрасывает много данных из очень длинных документов.

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

Загрузка предварительно обученного встраивания в Word

Datastore требует внедрения слова для преобразования документов в последовательности векторов. Загрузите предварительно обученное встраивание слов с помощью fastTextWordEmbedding. Эта функция требует Text Analytics Toolbox™ Model для fastText English 16 млрд Token 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, в таблицу, содержащую предикторы и ответы. The transformText функция принимает данные, считанные из tabularTextDatastore и возвращает таблицу предикторов и откликов. Предикторами являются массивы C-на-S векторов слов, заданные встраиванием слов emb, где C - размерность вложения, а S - длина последовательности. Ответы являются категориальными метками над классами.

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

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 использует графический процессор, если он доступен. Чтобы задать окружение выполнения вручную, используйте 'ExecutionEnvironment' Аргумент пары "имя-значение" из trainingOptions. Обучение на центральном процессоре может занять значительно больше времени, чем обучение на графическом процессоре. Для обучения с использованием графический процессор требуется Parallel Computing Toolbox™ и поддерживаемый графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

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 

Функция преобразования текста

The transformText функция принимает данные, считанные из tabularTextDatastore и возвращает таблицу предикторов и откликов. Предикторами являются массивы C-на-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

Функция чтения меток

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

function labels = readLabels(ttds,labelName)

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

end

См. также

| | | | | (Symbolic Math Toolbox) | (Symbolic Math Toolbox) | (Symbolic Math Toolbox) | (Symbolic Math Toolbox)

Похожие темы