В этом примере показов, как обучить нейронную сеть для глубокого обучения по данным последовательности нехватки памяти с помощью пользовательского мини-пакетного datastore.
Мини-пакетный datastore является реализацией datastore с поддержкой чтения данных пакетами. Используйте мини-пакетные хранилища данных для чтения данных , которых не помещаютсь в память, или для выполнения определенных операций предварительной обработки при считывании пакетов данных. Можно использовать мини-пакетный datastore в качестве источника наборов данных для обучения, валидации, тестирования и предсказания для применений глубокого обучения.
В этом примере используется пользовательский мини-пакет datastore sequenceDatastore.m
. Адаптировать этот datastore к данным можно путем настройки функций datastore. Для примера, показывающего, как создать свой собственный пользовательский мини-пакет datastore, смотрите Разработку Пользовательского мини-пакета Datastore.
Загрузите набор данных японских гласных, как описано в [1] и [2]. zip- файла japaneseVowels.zip
содержит последовательности различной длины. Последовательности разделены на две папки, Train
и Test
, которые содержат обучающие последовательности и тестовые последовательности, соответственно. В каждой из этих папок последовательности делятся на подпапки, которые нумеруются из 1
на 9
. Имена этих подпапок являются именами меток. A MAT файла представляет каждую последовательность. Каждая последовательность является матрицей с 12 строками, с одной строкой для каждой функции и меняющимся количеством столбцов с одним столбцом для каждого временного шага. Количество строк является размерностью последовательности, а количество столбцов - длиной последовательности.
Разархивируйте данные последовательности.
filename = "japaneseVowels.zip"; outputFolder = fullfile(tempdir,"japaneseVowels"); unzip(filename,outputFolder);
Создайте пользовательский мини-пакет datastore. Мини-пакет datastore sequenceDatastore
считывает данные из папки и получает метки из имен подпапок. Чтобы использовать этот datastore, сначала сохраните файл sequenceDatastore.m
на путь.
Создайте datastore, содержащее данные последовательности, используя sequenceDatastore
.
folderTrain = fullfile(outputFolder,"Train");
dsTrain = sequenceDatastore(folderTrain)
dsTrain = sequenceDatastore with properties: Datastore: [1×1 matlab.io.datastore.FileDatastore] Labels: [270×1 categorical] NumClasses: 9 SequenceDimension: 12 MiniBatchSize: 128 NumObservations: 270
Определите сетевую архитектуру LSTM. Задайте размерность последовательности входных данных как размер входов. Задает слой LSTM со 100 скрытыми модулями измерения и выводит последний элемент последовательности. Наконец, задайте полносвязный слой с выходным размером, равным количеству классов, затем слой softmax и слой классификации.
inputSize = dsTrain.SequenceDimension; numClasses = dsTrain.NumClasses; numHiddenUnits = 100; layers = [ sequenceInputLayer(inputSize) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
Задайте опции обучения. Задайте 'adam'
как решатель и 'GradientThreshold'
как 1. Установите размер мини-пакета равным 27 и установите максимальное количество эпох равным 75. Чтобы убедиться, что datastore создает мини-пакеты того размера, который trainNetwork
функция ожидает, также установите размер мини-пакета datastore на то же значение.
Поскольку мини-пакеты являются маленькими с короткими последовательностями, центральный процессор лучше подходит для обучения. Задайте 'ExecutionEnvironment'
на 'cpu'
. Для обучения на графическом процессоре, при наличии, установите 'ExecutionEnvironment'
на 'auto'
(значение по умолчанию).
miniBatchSize = 27; options = trainingOptions('adam', ... 'ExecutionEnvironment','cpu', ... 'MaxEpochs',75, ... 'MiniBatchSize',miniBatchSize, ... 'GradientThreshold',1, ... 'Verbose',0, ... 'Plots','training-progress'); dsTrain.MiniBatchSize = miniBatchSize;
Обучите сеть LSTM с заданными опциями обучения.
net = trainNetwork(dsTrain,layers,options);
Создайте хранилище datastore последовательности из тестовых данных.
folderTest = fullfile(outputFolder,"Test");
dsTest = sequenceDatastore(folderTest);
Классификация тестовых данных. Задайте тот же размер мини-пакета, что и для обучающих данных. Чтобы убедиться, что datastore создает мини-пакеты того размера, который classify
функция ожидает, также установите размер мини-пакета datastore на то же значение.
dsTest.MiniBatchSize = miniBatchSize;
YPred = classify(net,dsTest,'MiniBatchSize',miniBatchSize);
Вычислите классификационную точность предсказаний.
YTest = dsTest.Labels; acc = sum(YPred == YTest)./numel(YTest)
acc = 0.9432
[1] Кудо, М., Дж. Тояма и М. Симбо. «Многомерная классификация кривых с использованием областей». Распознавание Букв. Том 20, № 11-13, стр. 1103-1111.
[2] Кудо, М., Дж. Тояма и М. Симбо. Японский набор данных гласных. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels
lstmLayer
| sequenceInputLayer
| trainingOptions
| trainNetwork