Обучите сеть с помощью пользовательского мини-пакетного Datastore для данных последовательности

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

См. также

| | |

Похожие темы