matlab.io.datastore. Класс MiniBatchable

Пакет: 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