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

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

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

Этот пример использует пользовательский мини-пакетный datastore sequenceDatastore.m. Можно адаптировать этот datastore к данным путем настройки функций datastore. Для примера, показывающего, как создать ваш собственный мини-пакетный datastore, смотрите, Разрабатывают Пользовательский Мини-пакетный Datastore.

Загрузите обучающие данные

Загрузите японский набор данных Гласных как описано в [1] и [2]. Zip-файл japaneseVowels.zip содержит последовательности различной длины. Последовательности разделены на две папки, Train и Test, которые содержат обучающие последовательности и тестируют последовательности, соответственно. В каждой из этих папок последовательности разделены на подпапки, которые пронумерованы от 1 к 9. Имена этих подпапок являются именами метки. Файл 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] Kudo, M. J. Тояма, и М. Шимбо. "Многомерная Классификация Кривых Используя Прохождение через области". Буквы Распознавания образов. Издание 20, № 11-13, стр 1103–1111.

[2] Kudo, M. J. Тояма, и М. Шимбо. Японский Набор данных Гласных. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

Смотрите также

| | |

Похожие темы