minibatchqueue

Создайте мини-пакеты для глубокого обучения

Описание

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

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

Во время обучения можно управлять данными с помощью minibatchqueue объект. Можно перетасовать данные в начале каждой эпохи обучения, используя shuffle и собирать данные из очереди для каждой итерации обучения, используя next функция. Можно проверить, остаются ли какие-либо данные в очереди, используя hasdata функции, и reset очередь, когда она пуста.

Создание

Описание

пример

mbq = minibatchqueue(ds) создает minibatchqueue объект из входа datastore ds. Мини-пакеты в mbq имеют то же количество переменных, что и результаты read на входе datastore.

пример

mbq = minibatchqueue(ds,numOutputs) создает minibatchqueue объект из входа datastore ds и устанавливает количество переменных в каждом мини-пакете. Используйте этот синтаксис при использовании MiniBatchFcn чтобы задать мини-пакетную функцию предварительной обработки, которая имеет другое количество выходов, чем количество переменных входного datastore ds.

пример

mbq = minibatchqueue(___,Name,Value) устанавливает одно или несколько свойств с помощью опций имя-значение. Для примера, minibatchqueue(ds, "MiniBatchSize",64,"PartialMiniBatches","discard") устанавливает размер возвращенных мини-пакетов равным 64 и отбрасывает любые мини-пакеты с менее чем 64 наблюдениями.

Входные параметры

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

Входной datastore, заданный как MATLAB® datastore или пользовательский datastore.

Для получения дополнительной информации о хранилищах данных для глубокого обучения смотрите Datastores для глубокого обучения.

Количество переменных мини-пакета, заданное как положительное целое число. По умолчанию количество мини-пакетных переменных равно количеству переменных входного datastore.

Можно определить количество переменных входов datastore, исследуя выход read(ds). Если ваш datastore возвращает таблицу, количество переменных является количеством переменных таблицы. Если ваш datastore возвращает массив ячеек, количество переменных является размером второго измерения массива ячеек.

Если вы используете MiniBatchFcn аргумент имя-значение для задания мини-пакетной функции предварительной обработки, которая возвращает другое количество переменных, чем входной datastore, необходимо задать numOutputs для соответствия количеству выходов функции.

Пример: 2

Свойства

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

Это свойство доступно только для чтения.

Размер мини-пакетов, возвращаемых next функция, заданная как положительное целое число. Значение по умолчанию 128.

Пример: 256

Возврат или удаление неполных мини-пакетов, заданных как "return" или "discard".

Если общее количество наблюдений не точно делится на MiniBatchSize, окончательная мини-партия, возвращенная next функция может иметь меньше MiniBatchSize наблюдения. Это свойство определяет, как обрабатываются любые частичные мини-пакеты, используя следующие опции:

  • "return" - Мини-пакет может содержать меньше MiniBatchSize наблюдения. Все данные возвращаются.

    "discard" - Все мини-пакеты должны содержать точно MiniBatchSize наблюдения. Некоторые данные могут быть отброшены из очереди, если их недостаточно для полного мини-пакета.

Задайте PartialMiniBatch на "discard" если требуется, чтобы все мини-пакеты имели одинаковый размер.

Пример: "discard"

Типы данных: char | string

Это свойство доступно только для чтения.

Функция мини-пакетной предварительной обработки, заданная как "collate" или указатель на функцию.

Значение по умолчанию MiniBatchFcn является "collate". Эта функция объединяет переменные мини-пакета в массивы.

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

Если вы задаете пользовательскую функцию мини-пакетной предварительной обработки, функция должна объединить каждый пакет переменных выходов в массив после предварительной обработки и вернуть каждую переменную как отдельную функцию выхода. Функция должна принимать по крайней мере столько входы, сколько количество переменных базового datastore. Входы передаются в пользовательскую функцию как N ячеек -by-1, где N количество наблюдений в мини-пакете. Функция может вернуть столько переменных, сколько требуется. Если функция задана как MiniBatchFcn возвращает другое количество выходов, чем входы, задайте numOutputs как количество выходов функции.

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

ДействиеРекомендуемое свойство
Приведение переменной к различным типам данных.OutputCast
Перемещение данных в графический процессор.OutputEnvironment
Преобразуйте данные в dlarray.OutputAsDlarray
Применить формат данных к dlarray переменная.MiniBatchFormat

Пример: @myCustomFunction

Типы данных: char | string | function_handle

Предварительная обработка мини-пакетов в фоновом режиме в параллельном пуле, заданная в виде числа или логического 1 (true) или 0 (false).

Для использования этой опции требуется Parallel Computing Toolbox™. Вход datastore ds должен быть разделяемым. Пользовательские хранилища данных должны реализовать matlab.io.datastore.Partitionable класс.

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

Рабочие в пуле обрабатывают мини-пакеты с помощью функции, заданной MiniBatchFcn. Дальнейшая обработка, включая применение эффектов OutputCast, OutputEnvironment, OutputAsDlarray, и MiniBatchFormat, не происходит на рабочих.

Когда DispatchInBackground установлено в trueпрограмма открывает локальный параллельный пул, используя текущие параметры, если локальный пул в данный момент не открыт. Нелокальные пулы не поддерживаются. Пул открывается при первом вызове next.

Пример: true

Типы данных: logical

Это свойство доступно только для чтения.

Тип данных каждой мини-пакетной переменной, заданный как 'single', 'double', 'int8', 'int16', 'int32', 'int64', 'uint8', 'uint16', 'uint32', 'uint64', 'logical', или 'char', или массив ячеек из этих значений, или пустой вектор.

Если вы задаете OutputCast как пустой вектор, тип данных каждой мини-пакетной переменной неизменен. Чтобы задать различные типы данных для каждой переменной мини-пакета, задайте массив ячеек, содержащий запись для каждой переменной мини-пакета. Порядок элементов этого массива ячеек должен совпадать с порядком, в котором возвращаются переменные мини-пакета. Этот порядок является тем же порядком, в котором переменные возвращаются из функции, заданной MiniBatchFcn. Если вы не задаете пользовательскую функцию для MiniBatchFcn, это тот же порядок, в котором переменные возвращаются базовым datastore.

Вы должны убедиться, что значение OutputCast не конфликтует со значениями OutputAsDlarray или OutputEnvironment свойства. Если вы задаете OutputAsDlarray как true или 1, проверяйте, что тип данных, заданный OutputCast поддерживается dlarray. Если вы задаете OutputEnvironment как "gpu" или "auto" и поддерживаемый графический процессор доступен, проверяйте, что тип данных, заданный OutputCast поддерживается gpuArray (Parallel Computing Toolbox).

Пример: {'single','single','logical'}

Типы данных: char | string

Это свойство доступно только для чтения.

Флаг для преобразования переменной мини-пакета в dlarray, заданный как число или логическое 1 (true) или 0 (false) или как вектор числовых или логических значений.

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

Переменные, которые преобразуются в dlarray иметь базовый тип данных, заданный в OutputCast свойство.

Пример: [1,1,0]

Типы данных: logical

Это свойство доступно только для чтения.

Формат данных мини-пакетных переменных, заданный как вектор символов или массив ячеек векторов символов.

Мини-пакетный формат применяется к dlarray только переменные. Не- dlarray мини-пакетные переменные должны иметь MiniBatchFormat от ''.

Чтобы избежать ошибки, когда у вас есть смесь dlarray и не- dlarray переменные, необходимо задать значение для каждого выхода путем задания массива ячеек, содержащего запись для каждой переменной мини-пакета. Порядок элементов этого массива ячеек должен совпадать с порядком, в котором возвращаются переменные мини-пакета. Это тот же порядок, в котором переменные возвращаются из функции, заданной MiniBatchFcn. Если вы не задаете пользовательскую функцию для MiniBatchFcn, это тот же порядок, в котором переменные возвращаются базовым datastore.

Пример: {'SSCB', ''}

Типы данных: char | string

Аппаратный ресурс для мини-пакетных переменных, возвращенных с помощью next функция, заданная как одно из следующих значений:

  • 'auto' - Возвращает мини-пакетные переменные на графическом процессоре, если он доступен. В противном случае возвращает мини-пакетные переменные на центральном процессоре.

  • 'gpu' - Возвращает мини-пакетные переменные на графическом процессоре.

  • 'cpu' - Возвращает мини-пакетные переменные на центральном процессоре

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

Для использования графический процессор требуется Parallel Computing Toolbox. Для использования графический процессор для глубокого обучения необходимо иметь также поддерживаемое графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Если вы выбираете 'gpu' опция и Parallel Computing Toolbox или подходящий графический процессор недоступны, затем программное обеспечение возвращает ошибку.

Пример: {'gpu','cpu'}

Типы данных: char | string

Функции объекта

hasdataОпределите, может ли minibatchqueue вернуть мини-пакет
nextПолучите следующий мини-пакет данных из minibatchqueue
partitionРазделение minibatchqueue
resetСбросьте minibatchqueue к началу данных
shuffleДанные о тасовании в мини-очереди

Примеры

свернуть все

Использование minibatchqueue объект автоматически готовит мини-пакеты изображений и меток классификации для обучения в пользовательском цикле обучения.

Создайте datastore. Вызов read на auimds создает таблицу с двумя переменными: input, содержащие данные изображения и response, содержащего соответствующие классификационные метки.

auimds = augmentedImageDatastore([100 100],digitDatastore);
A = read(auimds);
head(A,2)
ans = 
         input         response
    _______________    ________

    {100×100 uint8}       0    
    {100×100 uint8}       0    

Создайте minibatchqueue объект из auimds. Установите MiniBatchSize свойство к 256.

The minibatchqueue объект имеет две выходные переменные: изображения и классификационные метки из input и response переменные auimds, соответственно. Установите minibatchqueue объект для возврата изображений в форматированный dlarray на графическом процессоре. Изображения являются одноканальными черно-белыми изображениями. Добавьте размерность синглтонного канала путем применения формата 'SSBC' в пакет. Возвратите метки как не - dlarray на центральном процессоре.

mbq = minibatchqueue(auimds,...
    'MiniBatchSize',256,...
    'OutputAsDlarray',[1,0],...
    'MiniBatchFormat',{'SSBC',''},...
    'OutputEnvironment',{'gpu','cpu'})

Используйте next функция для получения мини-пакетов от mbq.

[X,Y] = next(mbq);

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

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

unzip("MerchData.zip");
imds = imageDatastore("MerchData", ...
    "IncludeSubfolders",true, ...
    "LabelSource",'foldernames'); 

Создайте minibatchqueue который предварительно обрабатывает данные с помощью пользовательской функции preprocessMiniBatch заданное в конце этого примера. Пользовательская функция объединяет данные изображения в числовой массив, пересматривает изображение между 0 и 1 и вычисляет среднее значение пакета изображений. Функция возвращает пересмотренный пакет изображений и среднее изображение. Установите количество выходов равным 2, чтобы соответствовать количеству выходов функции.

mbq = minibatchqueue(imds,2,...
    'MiniBatchSize',16,...
    'MiniBatchFcn',@preprocessMiniBatch,...
    'OutputAsDlarray',0)
mbq = 
minibatchqueue with 2 outputs and properties:

   Mini-batch creation:
           MiniBatchSize: 16
        PartialMiniBatch: 'return'
            MiniBatchFcn: @preprocessMiniBatch
    DispatchInBackground: 0

   Outputs:
              OutputCast: {'single'  'single'}
         OutputAsDlarray: [0 0]
         MiniBatchFormat: {''  ''}
       OutputEnvironment: {'auto'  'auto'}

Получите мини-пакет и отобразите среднее значение изображений в мини-пакете.

[X,averageImage] = next(mbq);
imshow(averageImage)

Figure contains an axes. The axes contains an object of type image.

function [X,averageImage] = preprocessMiniBatch(XCell)
    X = cat(4,XCell{:});
    
    X = rescale(X,"InputMin",0,"InputMax",255);
    averageImage = mean(X,4);

end

Обучите сеть с помощью minibatchqueue управлять обработкой мини-пакетов.

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

Загрузите обучающие данные цифр и сохраните данные в datastore. Создайте datastore для изображений и один для меток с помощью arrayDatastore. Затем объедините хранилища данных, чтобы создать один datastore для использования с minibatchqueue.

[XTrain,YTrain] = digitTrain4DArrayData;
dsX = arrayDatastore(XTrain,'IterationDimension',4);
dsY = arrayDatastore(YTrain);

dsTrain = combine(dsX,dsY);

Определите количество уникальных классов в данных о метках.

classes = categories(YTrain);
numClasses = numel(classes);

Определение сети

Определите сеть и задайте среднее значение изображения с помощью 'Mean' опция на входном слое изображения.

layers = [
    imageInputLayer([28 28 1], 'Name','input','Mean',mean(XTrain,4))
    convolution2dLayer(5,20,'Name','conv1')
    reluLayer('Name', 'relu1')
    convolution2dLayer(3,20,'Padding',1,'Name','conv2')
    reluLayer('Name','relu2')
    convolution2dLayer(3,20,'Padding',1,'Name','conv3')
    reluLayer('Name','relu3')
    fullyConnectedLayer(numClasses,'Name','fc')
    softmaxLayer('Name','softmax')];
lgraph = layerGraph(layers);

Создайте dlnetwork объект из графика слоев.

dlnet = dlnetwork(lgraph);

Задайте функцию градиентов модели

Создайте вспомогательную функцию modelGradients, перечисленный в конце примера. Функция принимает как вход dlnetwork dlnet объекта и мини-пакет входных данных dlX с соответствующими метками Y, и возвращает потерю и градиенты потери относительно настраиваемых параметров в dlnet.

Настройка опций обучения

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

numEpochs = 10;
miniBatchSize = 128;

Визуализируйте процесс обучения на графике.

plots = "training-progress";

Создайте minibatchqueue

Использование minibatchqueue для обработки и управления мини-пакетами изображений. Для каждого мини-пакета:

  • Сбросьте частичные мини-пакеты.

  • Используйте пользовательскую функцию мини-пакетной предварительной обработки preprocessMiniBatch (определено в конце этого примера), чтобы закодировать метки классов с одним «горячим» кодом.

  • Форматируйте данные изображения с помощью меток размерностей 'SSCB' (пространственный, пространственный, канальный, пакетный). По умолчанию в minibatchqueue объект преобразует данные в dlarray объекты с базовым типом данных single. Не добавляйте формат к меткам классов.

  • Обучите на графическом процессоре, если он доступен. По умолчанию в minibatchqueue объект преобразует каждый выход в gpuArray при наличии графический процессор. Для использования графический процессор требуется Parallel Computing Toolbox™ и поддерживаемый графический процессор. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (Parallel Computing Toolbox).

mbq = minibatchqueue(dsTrain,...
    'MiniBatchSize',miniBatchSize,...
    'PartialMiniBatch','discard',...
    'MiniBatchFcn',@preprocessMiniBatch,...    
    'MiniBatchFormat',{'SSCB',''});

Обучите сеть

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

Инициализируйте график процесса обучения.

if plots == "training-progress"
    figure
    lineLossTrain = animatedline('Color',[0.85 0.325 0.098]);
    ylim([0 inf])
    xlabel("Iteration")
    ylabel("Loss")
    grid on
end

Инициализируйте средние градиенты и квадратные средние градиенты.

averageGrad = [];
averageSqGrad = [];

Обучите сеть.

iteration = 0;
start = tic;

for epoch = 1:numEpochs
    % Shuffle data.
    shuffle (mbq);
        
    while hasdata(mbq)
        iteration = iteration + 1;
        
        % Read mini-batch of data.
        [dlX,Y] = next(mbq);
              
        % Evaluate the model gradients and loss using dlfeval and the
        % modelGradients helper function.
        [grad,loss] = dlfeval(@modelGradients,dlnet,dlX,Y);
        
        % Update the network parameters using the Adam optimizer.
        [dlnet,averageGrad,averageSqGrad] = adamupdate(dlnet,grad,averageGrad,averageSqGrad,iteration);
        
        % Display the training progress.
        if plots == "training-progress"
            D = duration(0,0,toc(start),'Format','hh:mm:ss');
            addpoints(lineLossTrain,iteration,double(gather(extractdata(loss))))
            title("Epoch: " + epoch + ", Elapsed: " + string(D))
            drawnow
        end
    end
end

Функция градиентов модели

The modelGradients функция helper принимает как вход a dlnetwork dlnet объекта и мини-пакет входных данных dlX с соответствующими метками Y, и возвращает потерю и градиенты потери относительно настраиваемых параметров в dlnet. Чтобы вычислить градиенты автоматически, используйте dlgradient функция.

function [gradients,loss] = modelGradients(dlnet,dlX,Y)
    dlYPred = forward(dlnet,dlX);    
    loss = crossentropy(dlYPred,Y);    
    gradients = dlgradient(loss,dlnet.Learnables);
    
end

Функция мини-пакетной предварительной обработки

The preprocessMiniBatch функция предварительно обрабатывает данные с помощью следующих шагов:

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

  2. Извлеките данные метки из входящего массива ячеек и соедините вдоль второго измерения в категориальный массив.

  3. Однократное кодирование категориальных меток в числовые массивы. Кодирование в первую размерность создает закодированный массив, который совпадает с формой выходного сигнала сети.

function [X,Y] = preprocessMiniBatch(XCell,YCell)
    % Extract image data from the cell array and concatenate over fourth
    % dimension to add a third singleton dimension, as the channel
    % dimension.
    X = cat(4,XCell{:});

    % Extract label data from cell and concatenate.
    Y = cat(2,YCell{:});
    
    % One-hot encode labels.
    Y = onehotencode(Y,1);

end
Введенный в R2020b