exponenta event banner

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

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

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

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

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

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

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

Для преобразования документов в последовательности векторов в хранилище данных требуется вложение слова. Загрузить предварительно подготовленное вложение слов с помощью fastTextWordEmbedding. Для выполнения этой функции требуется модель 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]);

Просмотр предварительного просмотра хранилища данных.

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

Преобразовать хранилище данных

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

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

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

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

miniBatchSize = 64;
ttdsTrain.ReadSize = miniBatchSize;

Чтобы преобразовать выходные данные табличного текста в последовательности для обучения, преобразуйте хранилище данных с помощью 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

Предварительный просмотр преобразованного хранилища данных. Предикторами являются массивы 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. Хранилище данных не поддерживает тасование, поэтому установите 'Shuffle'Кому 'never'. Проверяйте сеть один раз в эпоху. Для контроля за ходом обучения установите 'Plots' опция для 'training-progress'. Для подавления подробных выходных данных установите 'Verbose' кому false.

По умолчанию trainNetwork использует графический процессор, если он доступен. Чтобы указать среду выполнения вручную, используйте 'ExecutionEnvironment' аргумент пары имя-значение trainingOptions. Обучение на CPU может занять значительно больше времени, чем обучение на GPU. Для обучения с использованием графического процессора требуется 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 

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

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

См. также

| | | | | (глубоко изучение комплекта инструментов) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения)

Связанные темы