exponenta event banner

minibatchqueue

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

Описание

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

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

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

Создание

Описание

пример

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

пример

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

пример

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

Входные аргументы

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

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

Дополнительные сведения о хранилищах данных для глубокого обучения см. в разделе Хранилища данных для глубокого обучения.

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

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

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

Пример: 2

Свойства

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

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

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

Пример: 256

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

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

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

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

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

Пример: "discard"

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

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

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

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

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

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

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

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

Пример: @myCustomFunction

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

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

Для использования этого параметра требуется Toolbox™ параллельных вычислений. Хранилище входных данных 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, это тот же порядок, в котором переменные возвращаются базовым хранилищем данных.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 'gpu' - Возвращает переменные мини-партии на GPU.

  • 'cpu' - Возврат переменных мини-пакета на ЦП

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

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

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

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

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

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

Примеры

свернуть все

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

Создание хранилища данных. Запрос 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 на GPU. Изображения представляют собой одноканальные черно-белые изображения. Добавление размера одиночного канала путем применения формата 'SSBC' в партию. Возврат меток в формате, отличном от -dlarray на CPU.

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

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

[X,Y] = next(mbq);

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

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

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 для управления обработкой мини-партий.

Загрузка данных обучения

Загрузите обучающие данные по цифрам и сохраните данные в хранилище данных. Создание хранилища данных для изображений и одного для меток с помощью arrayDatastore. Затем объедините хранилища данных, чтобы создать одно хранилище данных для использования с 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, перечисленных в конце примера. Функция принимает в качестве входного значения a dlnetwork объект dlnet и мини-пакет входных данных dlX с соответствующими метками Yи возвращает потери и градиенты потерь относительно обучаемых параметров в dlnet.

Укажите параметры обучения

Укажите параметры для использования во время обучения.

numEpochs = 10;
miniBatchSize = 128;

Визуализация хода обучения на графике.

plots = "training-progress";

Создать minibatchqueue

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

  • Отменить частичные мини-партии.

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

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

  • Обучение на GPU, если он доступен. По умолчанию minibatchqueue объект преобразует каждый вывод в gpuArray если графический процессор доступен. Для использования графического процессора требуется 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 вспомогательная функция принимает в качестве входного сигнала 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

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

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