Создайте мини-пакеты для глубокого обучения
Используйте 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
.
ds
— Введите datastoreВведите datastore в виде datastore MATLAB® или пользовательского datastore.
Для получения дополнительной информации о хранилищах данных для глубокого обучения, смотрите Хранилища данных для Глубокого обучения.
numOutputs
— Количество мини-пакетных переменныхКоличество мини-пакетных переменных в виде положительного целого числа. По умолчанию количество мини-пакетных переменных равно количеству переменных входного datastore.
Можно определить количество переменных входного datastore путем исследования выхода read(ds)
. Если ваш datastore возвращает таблицу, количество переменных является количеством переменных таблицы. Если ваш datastore возвращает массив ячеек, количество переменных является размером второго измерения массива ячеек.
Если вы используете MiniBatchFcn
пара "имя-значение", чтобы задать функцию предварительной обработки мини-пакета, которая выводит различное количество переменных, чем входной datastore, необходимо установить numOutputs
совпадать с количеством выходных параметров функции.
Пример 2
MiniBatchSize
— Размер мини-пакетов
(значение по умолчанию) | положительное целое числоЭто свойство доступно только для чтения.
Размер мини-пакетов, возвращенных 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
ложь
).
Используя эту опцию требует Parallel Computing Toolbox™ входной datastore ds
должно быть partitionable. Пользовательские хранилища данных должны реализовать matlab.io.datastore.Partitionable
класс.
Используйте эту опцию, когда ваши мини-пакеты потребуют тяжелой предварительной обработки. Эта опция использует параллельный пул, чтобы подготовить мини-пакеты в фоновом режиме, в то время как вы используете мини-пакеты во время обучения.
Рабочие в процессе пула мини-обрабатывают в пакетном режиме путем применения функции, заданной MiniBatchFcn
. Последующая обработка включая применение эффектов OutputCast, OutputEnvironment, OutputAsDlarray и MiniBatchFormat не происходит на рабочих.
Когда DispatchInBackground
установлен в истину, программное обеспечение открывает локальный параллельный пул с помощью текущих настроек, если локальный пул не в настоящее время открыт. Нелокальные пулы не поддерживаются. Пул открыт в первый раз, когда вы вызываете next
.
Пример: true
Типы данных: логический
OutputCast
— Тип данных каждой мини-пакетной переменной'single'
(значение по умолчанию) | 'double'
| 'int8'
| 'int16'
| 'int32'
| 'int64'
| 'uint8'
| 'uint16'
| 'uint32'
| 'uint64'
| 'logical'
| 'char'
| массив ячеекЭто свойство доступно только для чтения.
Тип данных каждой мини-пакетной переменной в виде 'single'
'double'
int8
int16
int32
int64
uint8
uint16
uint32
uint64
логический
, или '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
ложь
) или как вектор из числовых или логических значений.
Чтобы задать различное значение для каждого выхода, задайте вектор, содержащий запись для каждой мини-пакетной переменной. Порядок элементов этого вектора должен совпадать с порядком, мини-пакетная переменная возвращена. Этот порядок является тем же порядком, как переменные возвращены в функцию, заданную MiniBatchFcn
. Если вы не задаете пользовательский MiniBatchFcn
, это - тот же порядок, как переменные возвращены базовым datastore.
Переменные, которые преобразованы в dlarray, имеют базовый тип данных, как задано свойством OutputCast.
Пример: [1,1,0]
Типы данных: логический
MiniBatchFormat
— Формат данных мини-пакетных переменных''
(значение по умолчанию) | массив символов | массив ячеекЭто свойство доступно только для чтения.
Формат данных мини-пакетных переменных в виде массива символов или массива ячеек массивов символов.
Мини-пакетный формат применяется к dlarray
переменные только. Non-dlarray
мини-пакетные переменные должны иметь MiniBatchFormat
из ''
.
Избегать ошибки, когда у вас есть соединение dlarray
и non-dlarray
переменные, необходимо задать значение для каждого выхода путем обеспечения массива ячеек, содержащего запись для каждой мини-пакетной переменной. Порядок элементов этого массива ячеек должен совпадать с порядком, мини-пакетные переменные возвращены. Это - тот же порядок, как переменные возвращены в функцию, заданную MiniBatchFcn
. Если вы не задаете пользовательский MiniBatchFcn
, это - тот же порядок, как переменные возвращены базовым datastore.
Пример: {'SSCB', ''}
Типы данных: char |
string
OutputEnvironment
— Аппаратный ресурс для мини-пакетных переменных'auto'
(значение по умолчанию) | 'gpu'
| 'cpu'
| массив ячеекАппаратный ресурс для мини-пакетных переменных возвратил использование next
функция в виде одного из следующих значений:
'auto'
— Мини-пакетные переменные возвращены на графическом процессоре, если вы доступны. В противном случае мини-пакетные переменные возвращены на центральном процессоре.
'gpu'
— Мини-пакетные переменные возвращены на графическом процессоре.
'cpu'
— Мини-пакетные переменные возвращены на центральном процессоре
Чтобы возвратить только определенные переменные на графическом процессоре, задайте OutputEnvironment
как массив ячеек, содержащий запись для каждой мини-пакетной переменной. Порядок элементов этого массива ячеек должен совпадать с порядком, мини-пакетная переменная возвращена. Этот порядок является тем же порядком, как переменные возвращены в функцию, заданную MiniBatchFcn
. Если вы не задаете пользовательский MiniBatchFcn
, это - тот же порядок, как переменные возвращены базовым datastore.
Используя графический процессор требует Parallel Computing Toolbox. Чтобы использовать графический процессор для глубокого обучения, у вас должен также быть CUDA®, включенный NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Если вы выбираете 'gpu'
опция и Parallel Computing Toolbox или подходящий графический процессор не доступны, затем программное обеспечение возвращает ошибку.
Пример: {'gpu','cpu'}
Типы данных: char |
string
Используйте 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
в пользовательском учебном циклеОбучите сеть с помощью 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
функция предварительно обрабатывает данные с помощью следующих шагов:
Извлеките данные изображения из массива входящей ячейки и конкатенируйте в числовой массив. Конкатенация данных изображения по четвертой размерности добавляет третью размерность в каждое изображение, чтобы использоваться в качестве одноэлементной размерности канала.
Извлеките данные о метке из массива входящей ячейки и конкатенируйте вдоль второго измерения в категориальный массив.
Одногорячий кодируют категориальные метки в числовые массивы. Кодирование в первую размерность производит закодированный массив, который совпадает с формой сетевого выхода.
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
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.