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.

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

развернуть все

Введите datastore в виде datastore MATLAB® или пользовательского 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
Преобразуйте данные в dlarrayOutputAsDlarray
Примените формат данных к 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 установлен в истину, программное обеспечение открывает локальный параллельный пул с помощью текущих настроек, если локальный пул не в настоящее время открыт. Нелокальные пулы не поддерживаются. Пул открыт в первый раз, когда вы вызываете 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. Чтобы использовать графический процессор для глубокого обучения, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Если вы выбираете 'gpu' опция и Parallel Computing Toolbox или подходящий графический процессор не доступны, затем программное обеспечение возвращает ошибку.

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

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

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

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

Примеры

свернуть все

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

Создание Datastore. Вызов чтения на 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)

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™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше.

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 cell and concatenate over 4th dimension to adds a
    % singleton dimension 3 for 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
Введенный в R2020a