minibatchqueue

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

Описание

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

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.

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

Количество мини-пакетных переменных в виде положительного целого числа. По умолчанию количество мини-пакетных переменных равно количеству переменных входного 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 ложь).

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

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

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

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

Пример: true

Типы данных: логический

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

Тип данных каждой мини-пакетной переменной в виде 'single''double'int8int16int32int64uint8uint16uint32uint64логический, или '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 ложь) или как вектор из числовых или логических значений.

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

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

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

Типы данных: логический

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

Используйте 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.

minibatchqueue объект имеет две выходных переменные: изображения и классификация помечают от input и response переменные auimds, соответственно. Установите minibatchqueue возразите, чтобы возвратить изображения как отформатированный dlarray на графическом процессоре. Изображения являются одноканальными черно-белыми изображениями. Добавьте одноэлементную размерность канала путем применения формата 'SSBC' к пакету. Возвратите метки как non-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 object. The axes object 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);

Сеть Define

Задайте сеть и задайте среднее значение изображений с помощью '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);

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

Создайте функцию помощника 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™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (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

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

modelGradients функция помощника берет в качестве входа 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

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

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