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