Создайте мини-пакеты для глубокого обучения
Использование 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 наблюдениями.
ds
- Входной datastoreВходной datastore, заданный как MATLAB® datastore или пользовательский datastore.
Для получения дополнительной информации о хранилищах данных для глубокого обучения смотрите Datastores для глубокого обучения.
numOutputs
- Количество переменных мини-пакетаКоличество переменных мини-пакета, заданное как положительное целое число. По умолчанию количество мини-пакетных переменных равно количеству переменных входного datastore.
Можно определить количество переменных входов datastore, исследуя выход read(ds)
. Если ваш datastore возвращает таблицу, количество переменных является количеством переменных таблицы. Если ваш datastore возвращает массив ячеек, количество переменных является размером второго измерения массива ячеек.
Если вы используете MiniBatchFcn
аргумент имя-значение для задания мини-пакетной функции предварительной обработки, которая возвращает другое количество переменных, чем входной datastore, необходимо задать numOutputs
для соответствия количеству выходов функции.
Пример: 2
MiniBatchSize
- Размер мини-партий128
(по умолчанию) | положительное целое числоЭто свойство доступно только для чтения.
Размер мини-пакетов, возвращаемых next
функция, заданная как положительное целое число. Значение по умолчанию 128
.
Пример: 256
PartialMiniBatch
- Возврат или сброс неполных мини-пакетов"return"
(по умолчанию) | "discard"
Возврат или удаление неполных мини-пакетов, заданных как "return"
или "discard"
.
Если общее количество наблюдений не точно делится на MiniBatchSize
, окончательная мини-партия, возвращенная next
функция может иметь меньше MiniBatchSize
наблюдения. Это свойство определяет, как обрабатываются любые частичные мини-пакеты, используя следующие опции:
"return"
- Мини-пакет может содержать меньше MiniBatchSize
наблюдения. Все данные возвращаются.
"discard"
- Все мини-пакеты должны содержать точно MiniBatchSize
наблюдения. Некоторые данные могут быть отброшены из очереди, если их недостаточно для полного мини-пакета.
Задайте PartialMiniBatch
на "discard"
если требуется, чтобы все мини-пакеты имели одинаковый размер.
Пример: "discard"
Типы данных: char
| string
MiniBatchFcn
- Функция мини-пакетной предварительной обработки"collate"
(по умолчанию) | указатель на функциюЭто свойство доступно только для чтения.
Функция мини-пакетной предварительной обработки, заданная как "collate"
или указатель на функцию.
Значение по умолчанию MiniBatchFcn
является "collate"
. Эта функция объединяет переменные мини-пакета в массивы.
Используйте указатель на функцию для пользовательской функции для предварительной обработки мини-пакетов для пользовательского обучения. Это рекомендуется для меток классификации с одним горячим кодированием, данных последовательности заполнения, вычисления средних изображений и так далее. Необходимо задать пользовательскую функцию, если данные состоят из массивов ячеек, содержащих массивы разных размеров.
Если вы задаете пользовательскую функцию мини-пакетной предварительной обработки, функция должна объединить каждый пакет переменных выходов в массив после предварительной обработки и вернуть каждую переменную как отдельную функцию выхода. Функция должна принимать по крайней мере столько входы, сколько количество переменных базового datastore. Входы передаются в пользовательскую функцию как N ячеек -by-1, где N количество наблюдений в мини-пакете. Функция может вернуть столько переменных, сколько требуется. Если функция задана как MiniBatchFcn
возвращает другое количество выходов, чем входы, задайте numOutputs
как количество выходов функции.
Следующие действия не рекомендованы в пользовательской функции. Чтобы воспроизвести желаемое поведение, вместо этого установите соответствующее свойство при создании minibatchqueue
объект.
Действие | Рекомендуемое свойство |
---|---|
Приведение переменной к различным типам данных. | OutputCast |
Перемещение данных в графический процессор. | OutputEnvironment |
Преобразуйте данные в dlarray . | OutputAsDlarray |
Применить формат данных к dlarray переменная. | MiniBatchFormat |
Пример: @myCustomFunction
Типы данных: char
| string
| function_handle
DispatchInBackground
- Предварительная обработка мини-пакетов в фоновом режиме в параллельном пулеfalse
или 0
(по умолчанию) | true
или 1
Предварительная обработка мини-пакетов в фоновом режиме в параллельном пуле, заданная в виде числа или логического 1
(true
) или 0
(false
).
Для использования этой опции требуется Parallel Computing Toolbox™. Вход datastore ds
должен быть разделяемым. Пользовательские хранилища данных должны реализовать matlab.io.datastore.Partitionable
класс.
Используйте эту опцию, когда мини-пакеты требуют тяжелой предварительной обработки. Эта опция использует параллельный пул для подготовки мини-пакетов в фоновом режиме во время использования мини-пакетов во время обучения.
Рабочие в пуле обрабатывают мини-пакеты с помощью функции, заданной MiniBatchFcn
. Дальнейшая обработка, включая применение эффектов OutputCast
, OutputEnvironment
, OutputAsDlarray
, и MiniBatchFormat
, не происходит на рабочих.
Когда DispatchInBackground
установлено в true
программа открывает локальный параллельный пул, используя текущие параметры, если локальный пул в данный момент не открыт. Нелокальные пулы не поддерживаются. Пул открывается при первом вызове next
.
Пример: true
Типы данных: logical
OutputCast
- Тип данных каждой мини-пакетной переменной'single'
(по умолчанию) | 'double'
| 'int8'
| 'int16'
| 'int32'
| 'int64'
| 'uint8'
| 'uint16'
| 'uint32'
| 'uint64'
| 'logical'
| 'char'
| массив ячеекЭто свойство доступно только для чтения.
Тип данных каждой мини-пакетной переменной, заданный как '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
OutputAsDlarray
- Флаг для преобразования переменной мини-пакета в dlarray
true
или 1
(по умолчанию) | false
или 0
| вектор логических значенийЭто свойство доступно только для чтения.
Флаг для преобразования переменной мини-пакета в dlarray
, заданный как число или логическое 1
(true
) или 0
(false
) или как вектор числовых или логических значений.
Чтобы задать другое значение для каждого выхода, задайте вектор, содержащий запись для каждой переменной мини-пакета. Порядок элементов этого вектора должен совпадать с порядком, в котором возвращается переменная мини-пакета. Этот порядок является тем же порядком, в котором переменные возвращаются из функции, заданной MiniBatchFcn
. Если вы не задаете пользовательскую функцию для MiniBatchFcn
, это тот же порядок, в котором переменные возвращаются базовым datastore.
Переменные, которые преобразуются в dlarray
иметь базовый тип данных, заданный в OutputCast
свойство.
Пример: [1,1,0]
Типы данных: logical
MiniBatchFormat
- Формат данных мини-пакетных переменных''
(по умолчанию) | вектор символов | массив ячеекЭто свойство доступно только для чтения.
Формат данных мини-пакетных переменных, заданный как вектор символов или массив ячеек векторов символов.
Мини-пакетный формат применяется к dlarray
только переменные. Не- dlarray
мини-пакетные переменные должны иметь MiniBatchFormat
от ''
.
Чтобы избежать ошибки, когда у вас есть смесь dlarray
и не- dlarray
переменные, необходимо задать значение для каждого выхода путем задания массива ячеек, содержащего запись для каждой переменной мини-пакета. Порядок элементов этого массива ячеек должен совпадать с порядком, в котором возвращаются переменные мини-пакета. Это тот же порядок, в котором переменные возвращаются из функции, заданной MiniBatchFcn
. Если вы не задаете пользовательскую функцию для MiniBatchFcn
, это тот же порядок, в котором переменные возвращаются базовым datastore.
Пример: {'SSCB', ''}
Типы данных: char
| string
OutputEnvironment
- Аппаратный ресурс для мини-пакетных переменных'auto'
(по умолчанию) | 'gpu'
| 'cpu'
| массив ячеекАппаратный ресурс для мини-пакетных переменных, возвращенных с помощью 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
Использование 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)
function [X,averageImage] = preprocessMiniBatch(XCell) X = cat(4,XCell{:}); X = rescale(X,"InputMin",0,"InputMax",255); averageImage = mean(X,4); end
minibatchqueue
в пользовательском цикле обученияОбучите сеть с помощью 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
функция предварительно обрабатывает данные с помощью следующих шагов:
Извлеките данные изображения из входящего массива ячеек и соедините данные в числовой массив. Конкатенация данных изображения по четвертому измерению добавляет третье измерение к каждому изображению, которое используется в качестве размерности одинарного канала.
Извлеките данные метки из входящего массива ячеек и соедините вдоль второго измерения в категориальный массив.
Однократное кодирование категориальных меток в числовые массивы. Кодирование в первую размерность создает закодированный массив, который совпадает с формой выходного сигнала сети.
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
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.