В этом примере показано, как классифицировать текстовые данные из памяти с нейронной сетью для глубокого обучения с помощью преобразованного datastore.
Преобразованный datastore преобразовывает или данные о процессах, считанные из базового datastore. Можно использовать преобразованный datastore в качестве источника обучения, валидации, теста и наборов данных предсказания для применения глубокого обучения. Используйте преобразованные хранилища данных, чтобы считать данные, которые не помещаются в память, или выполнить определенные операции предварительной обработки при чтении пакетов данных.
При обучении сети программное обеспечение создает мини-пакеты последовательностей той же длины путем дополнения, обрезая или разделяя входные данные. trainingOptions
функция предоставляет возможности заполнять и обрезать входные последовательности, однако, эти опции не хорошо подходят для последовательностей векторов слова. Кроме того, эта функция не поддерживает дополнительные данные в пользовательском datastore. Вместо этого необходимо заполнить и обрезать последовательности вручную. Если вы лево-заполняете и обрезаете последовательности векторов слова, то учебная сила улучшается.
Классифицировать текстовые Данные Используя пример Глубокого обучения вручную обрезают и заполняют все документы той же длине. Этот процесс добавляет большое дополнение к очень коротким документам и отбрасывает много данных из очень длинных документов.
В качестве альтернативы, чтобы предотвратить добавление слишком большого дополнения или отбрасывание слишком большого количества данных, создайте преобразованный datastore, который вводит мини-пакеты в сеть. Datastore, созданный в этом примере, преобразует мини-пакеты документов последовательностям или словарей и лево-заполняет каждый мини-пакет к длине самого длинного документа в мини-пакете.
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 до таблицы, содержащей предикторы и ответы. 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 с 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
выполняет эти шаги:
Маркируйте текст с помощью tokenizedDocument
.
Преобразуйте текст в нижний регистр с помощью lower
.
Сотрите пунктуацию с помощью 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
doc2sequence
| fastTextWordEmbedding
| tokenizedDocument
| transform
| wordEmbeddingLayer
| lstmLayer
(Deep Learning Toolbox) | sequenceInputLayer
(Deep Learning Toolbox) | trainingOptions
(Deep Learning Toolbox) | trainNetwork
(Deep Learning Toolbox)