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

Для получения информации об атрибутах класса см. Атрибуты класса (MATLAB).

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

Указатель. Чтобы изучить, как классы Handle влияют на операции копии, смотрите Копирование Объектов (MATLAB).

Примеры

свернуть все

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

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

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

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

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

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

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

Для учебных предикторов создайте datastore файла и задайте функцию чтения, чтобы быть load функция. load функция, загружает данные из 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 файла и задайте функцию чтения, чтобы быть readLabel функция, заданная в конце примера. 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 файла с функцией чтения readLabel и задайте, чтобы включать подпапки. Укажите, что выходные параметры вертикально concatenateable путем установки 'UniformRead' опция к true.

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

Функции

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

function label = readLabel(filename,classNames)

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

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

end

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] Kudo, M. J. Тояма, и М. Шимбо. "Многомерная Классификация Кривых Используя Прохождение через области". Буквы Распознавания образов. Издание 20, № 11-13, стр 1103–1111.

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

Введенный в R2018a