matlab.io.datastore.MiniBatchable class

Пакет: matlab.io.datastore

Добавьте мини-пакетную поддержку datastore

Описание

matlab.io.datastore.MiniBatchable - абстрактный класс mixin, который добавляет поддержку мини-пакетов в пользовательский datastore для использования с Deep Learning Toolbox™. Мини-пакет datastore содержит наборы обучающих и тестовых данных для использования в обучении, предсказании и классификации Deep Learning Toolbox.

Чтобы использовать этот класс mixin, вы должны наследовать от matlab.io.datastore.MiniBatchable класс в дополнение к наследованию от matlab.io.Datastore базовый класс. Введите следующий синтаксис в качестве первой линии файла определения класса:

classdef MyDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.MiniBatchable
    ...
end

Чтобы добавить поддержку мини-пакетов в datastore:

  • Наследование от дополнительного matlab.io.datastore.MiniBatchable класса

  • Задайте два дополнительных свойства: MiniBatchSize и NumObservations.

Для получения дополнительной информации и шагов по созданию пользовательского мини-пакетного datastore для оптимизации эффективности во время обучения, предсказания и классификации, см. Раздел «Разработка пользовательского мини-пакета Datastore».

Свойства

расширить все

Количество наблюдений, которые возвращаются в каждом пакете или вызове read функция. Для обучения, предсказания и классификации MiniBatchSize для свойства задан размер мини-пакета, заданный в trainingOptions.

Атрибуты:

Abstracttrue
AccessPublic

Общее количество наблюдений, содержащихся в datastore. Такое количество наблюдений составляет длину одной эпохи обучения.

Атрибуты:

Abstracttrue
SetAccessProtected
ReadAccessPublic

Признаки

Abstracttrue
Sealedfalse

Для получения информации об атрибутах класса см. раздел «Атрибуты класса».

Копировать семантику

Указатель. Чтобы узнать, как классы handle влияют на операции копирования, см. раздел «Копирование объектов».

Примеры

свернуть все

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

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

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

Загрузка обучающих данных

Загрузите набор данных японских гласных, как описано в [1] и [2]. zip- файла japaneseVowels.zip содержит последовательности различной длины. Последовательности разделены на две папки, Train и Test, которые содержат обучающие последовательности и тестовые последовательности, соответственно. В каждой из этих папок последовательности делятся на подпапки, которые нумеруются из 1 на 9. Имена этих подпапок являются именами меток. A MAT файла представляет каждую последовательность. Каждая последовательность является матрицей с 12 строками, с одной строкой для каждой функции и меняющимся количеством столбцов с одним столбцом для каждого временного шага. Количество строк является размерностью последовательности, а количество столбцов - длиной последовательности.

Разархивируйте данные последовательности.

filename = "japaneseVowels.zip";
outputFolder = fullfile(tempdir,"japaneseVowels");
unzip(filename,outputFolder);

Для предикторов обучения создайте файл datastore и укажите, что функция read будет load функция. The load function, загружает данные из MAT-файла в массив структур. Чтобы считать файлы из подпапок в папке обучения, установите 'IncludeSubfolders' опция для true.

folderTrain = fullfile(outputFolder,"Train");
fdsPredictorTrain = fileDatastore(folderTrain, ...
    'ReadFcn',@load, ...
    'IncludeSubfolders',true);

Предварительный просмотр datastore. Возвращённый struct содержит одну последовательность из первого файла.

preview(fdsPredictorTrain)
ans = struct with fields:
    X: [12×20 double]

Для меток создайте файл datastore и укажите функцию read, которая будет readLabel function, заданная в конце примера. The readLabel функция извлекает метку из имени подпапки.

classNames = string(1:9);
fdsLabelTrain = fileDatastore(folderTrain, ...
    'ReadFcn',@(filename) readLabel(filename,classNames), ...
    'IncludeSubfolders',true);

Предварительный просмотр datastore. Это выход соответствует метке первого файла.

preview(fdsLabelTrain)
ans = categorical
     1 

Преобразование и объединение хранилищ данных

Чтобы ввести данные последовательности из datastore предикторов в нейронную сеть для глубокого обучения, мини-пакеты последовательностей должны иметь одинаковую длину. Преобразуйте datastore, используя padSequence функция, заданная в конце datastore, которая заполняет или обрезает последовательности, чтобы иметь длину 20.

sequenceLength = 20;
tdsTrain = transform(fdsPredictorTrain,@(data) padSequence(data,sequenceLength));

Предварительный просмотр преобразованного datastore. Этот выход соответствует заполненной последовательности из первого файла.

X = preview(tdsTrain)
X = 1×1 cell array
    {12×20 double}

Чтобы ввести предикторы и метки из обоих хранилищ данных в нейронную сеть для глубокого обучения, объедините их с помощью combine функция.

cdsTrain = combine(tdsTrain,fdsLabelTrain);

Предварительный просмотр объединенного datastore. datastore возвращает массив ячеек 1 на 2. Первый элемент соответствует предикторам. Второй элемент соответствует метке.

preview(cdsTrain)
ans = 1×2 cell array
    {12×20 double}    {[1]}

Определение сетевой архитектуры LSTM

Определите сетевую архитектуру LSTM. Задайте количество функций входных данных как размер входов. Задает слой LSTM со 100 скрытыми модулями измерения и выводит последний элемент последовательности. Наконец, задайте полносвязный слой с выходным размером, равным количеству классов, затем слой softmax и слой классификации.

numFeatures = 12;
numClasses = numel(classNames);
numHiddenUnits = 100;

layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits,'OutputMode','last')
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

Задайте опции обучения. Установите решатель равным 'adam' и 'GradientThreshold' к 2. Установите размер мини-пакета равным 27 и установите максимальное количество эпох равным 75. Хранилища данных не поддерживают тасование, поэтому задайте 'Shuffle' на 'never'.

Поскольку мини-пакеты являются маленькими с короткими последовательностями, центральный процессор лучше подходит для обучения. Задайте 'ExecutionEnvironment' на 'cpu'. Для обучения на графическом процессоре, при наличии, установите 'ExecutionEnvironment' на 'auto' (значение по умолчанию).

miniBatchSize = 27;

options = trainingOptions('adam', ...
    'ExecutionEnvironment','cpu', ...
    'MaxEpochs',75, ...
    'MiniBatchSize',miniBatchSize, ...
    'GradientThreshold',2, ...
    'Shuffle','never',...
    'Verbose',0, ...
    'Plots','training-progress');

Обучите сеть LSTM с заданными опциями обучения.

net = trainNetwork(cdsTrain,layers,options);

Тестируйте сеть

Создайте преобразованный datastore, содержащий удержанные тестовые данные, используя те же шаги, что и для обучающих данных.

folderTest = fullfile(outputFolder,"Test");

fdsPredictorTest = fileDatastore(folderTest, ...
    'ReadFcn',@load, ...
    'IncludeSubfolders',true);
tdsTest = transform(fdsPredictorTest,@(data) padSequence(data,sequenceLength));

Делайте предсказания по тестовым данным, используя обученную сеть.

YPred = classify(net,tdsTest,'MiniBatchSize',miniBatchSize);

Вычислите классификационную точность тестовых данных. Чтобы получить метки тестового набора, создайте файл datastore с функцией read readLabel и задайте, чтобы включать подпапки. Задайте, что выходы являются вертикально конкатенабельными, установив 'UniformRead' опция для true.

fdsLabelTest = fileDatastore(folderTest, ...
    'ReadFcn',@(filename) readLabel(filename,classNames), ...
    'IncludeSubfolders',true, ...
    'UniformRead',true);
YTest = readall(fdsLabelTest);
accuracy = mean(YPred == YTest)
accuracy = 0.9351

Функции

The readLabel функция извлекает метку из заданного имени файла по категориям в classNames.

function label = readLabel(filename,classNames)

filepath = fileparts(filename);
[~,label] = fileparts(filepath);

label = categorical(string(label),classNames);

end

The padSequence функция заполняет или обрезает последовательность в data.X иметь заданную длину последовательности и возвращает результат в камере 1 на 1.

function sequence = padSequence(data,sequenceLength)

sequence = data.X;
[C,S] = size(sequence);

if S < sequenceLength
    padding = zeros(C,sequenceLength-S);
    sequence = [sequence padding];
else
    sequence = sequence(:,1:sequenceLength);
end

sequence = {sequence};

end

Вопросы совместимости

расширить все

Не рекомендуемый запуск в R2019a

Ссылки

[1] Кудо, М., Дж. Тояма и М. Симбо. «Многомерная классификация кривых с использованием областей». Распознавание Букв. Том 20, № 11-13, стр. 1103-1111.

[2] Кудо, М., Дж. Тояма и М. Симбо. Японский набор данных гласных. https://archive.ics.uci.edu/ml/datasets/Japanese+Vowels

Введенный в R2018a