Создание мини-пакетов для глубокого обучения
Использовать 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 наблюдениями.
ds
- Хранилище входных данныхВходное хранилище данных, указанное как хранилище данных MATLAB ® или пользовательское хранилище данных.
Дополнительные сведения о хранилищах данных для глубокого обучения см. в разделе Хранилища данных для глубокого обучения.
numOutputs
- Количество переменных мини-партииЧисло переменных мини-пакета, указанное как положительное целое число. По умолчанию количество переменных мини-пакета равно количеству переменных входного хранилища данных.
Количество переменных входного хранилища данных можно определить, изучив выходные данные read(ds)
. Если хранилище данных возвращает таблицу, количество переменных - это количество переменных таблицы. Если хранилище данных возвращает массив ячеек, число переменных соответствует размеру второго измерения массива ячеек.
Если вы используете MiniBatchFcn
аргумент name-value для указания функции предварительной обработки мини-пакета, которая возвращает другое количество переменных, чем входное хранилище данных, необходимо установить 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"
. Эта функция объединяет переменные мини-пакета в массивы.
Используйте дескриптор функции для пользовательской функции для предварительной обработки мини-пакетов для пользовательского обучения. Это рекомендуется для однокодовых классификационных меток кодирования, заполнения данных последовательности, вычисления средних изображений и т.д. Необходимо указать пользовательскую функцию, если данные состоят из массивов ячеек, содержащих массивы различных размеров.
Если указана пользовательская функция предварительной обработки мини-пакета, функция должна объединять каждый пакет выходных переменных в массив после предварительной обработки и возвращать каждую переменную как отдельный вывод функции. Функция должна принимать по крайней мере столько входных данных, сколько переменных базового хранилища данных. Входные данные передаются пользовательской функции в виде 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
).
Для использования этого параметра требуется Toolbox™ параллельных вычислений. Хранилище входных данных 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
, это тот же порядок, в котором переменные возвращаются базовым хранилищем данных.
Необходимо убедиться, что значение OutputCast
не конфликтует со значениями OutputAsDlarray
или OutputEnvironment
свойства. При указании OutputAsDlarray
как true
или 1
, проверьте, что тип данных указан в OutputCast
поддерживается dlarray
. При указании OutputEnvironment
как "gpu"
или "auto"
и доступен поддерживаемый графический процессор, проверьте, что тип данных указан в OutputCast
поддерживается gpuArray
(Панель инструментов параллельных вычислений).
Пример: {'single','single','logical'}
Типы данных: char
| string
OutputAsDlarray
- Флаг для преобразования переменной мини-партии в dlarray
true
или 1
(по умолчанию) | false
или 0
| вектор логических значенийЭто свойство доступно только для чтения.
Флаг для преобразования переменной мини-пакета в dlarray
, указано как числовое или логическое 1
(true
) или 0
(false
) или как вектор числовых или логических значений.
Чтобы задать другое значение для каждого вывода, укажите вектор, содержащий запись для каждой переменной мини-пакета. Порядок элементов этого вектора должен соответствовать порядку, в котором возвращается переменная мини-пакета. Этот порядок совпадает с порядком, в котором переменные возвращаются из функции, указанной MiniBatchFcn
. Если не указана пользовательская функция для MiniBatchFcn
, это тот же порядок, в котором переменные возвращаются базовым хранилищем данных.
Переменные, преобразованные в dlarray
имеют базовый тип данных, указанный OutputCast
собственность.
Пример: [1,1,0]
Типы данных: logical
MiniBatchFormat
- Формат данных переменных мини-пакета''
(по умолчанию) | символьный вектор | массив ячеекЭто свойство доступно только для чтения.
Формат данных переменных мини-пакета, определяемый как символьный вектор или массив ячеек символьных векторов.
Формат мини-пакета применяется к dlarray
только переменные. Не -dlarray
переменные мини-пакета должны иметь MiniBatchFormat
из ''
.
Чтобы избежать ошибки при смешивании dlarray
и не-dlarray
переменные, необходимо указать значение для каждого вывода, предоставив массив ячеек, содержащий запись для каждой переменной мини-пакета. Порядок элементов этого массива ячеек должен соответствовать порядку, в котором возвращаются переменные мини-пакета. Это тот же порядок, в котором переменные возвращаются из функции, указанной MiniBatchFcn
. Если не указана пользовательская функция для MiniBatchFcn
, это тот же порядок, в котором переменные возвращаются базовым хранилищем данных.
Пример: {'SSCB', ''}
Типы данных: char
| string
OutputEnvironment
- Аппаратный ресурс для переменных мини-пакета'auto'
(по умолчанию) | 'gpu'
| 'cpu'
| массив ячеекАппаратный ресурс для переменных мини-пакета, возвращенный с помощью next
функция, заданная как одно из следующих значений:
'auto'
- Возвращает переменные мини-партии на GPU, если они доступны. В противном случае верните переменные мини-пакета на CPU.
'gpu'
- Возвращает переменные мини-партии на GPU.
'cpu'
- Возврат переменных мини-пакета на ЦП
Для возврата только определенных переменных на GPU укажите OutputEnvironment
как массив ячеек, содержащий запись для каждой переменной мини-пакета. Порядок элементов этого массива ячеек должен соответствовать порядку возврата переменной мини-пакета. Этот порядок совпадает с порядком, в котором переменные возвращаются из функции, указанной MiniBatchFcn
. Если пользователь не указан MiniBatchFcn
, это тот же порядок, что и переменные, возвращаемые базовым хранилищем данных.
Для использования графического процессора требуется панель инструментов параллельных вычислений. Чтобы использовать графический процессор для глубокого обучения, необходимо также иметь поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox). При выборе 'gpu'
option и Parallel Computing Toolbox или подходящий графический процессор недоступны, то программное обеспечение возвращает ошибку.
Пример: {'gpu','cpu'}
Типы данных: char
| string
Использовать 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)
function [X,averageImage] = preprocessMiniBatch(XCell) X = cat(4,XCell{:}); X = rescale(X,"InputMin",0,"InputMax",255); averageImage = mean(X,4); end
minibatchqueue
в индивидуальном цикле обученияОбучение сети с помощью 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
функция выполняет предварительную обработку данных с помощью следующих шагов:
Извлеките данные изображения из входящего массива ячеек и объедините их в числовой массив. Конкатенация данных изображения над четвертым размером добавляет к каждому изображению третий размер, который будет использоваться в качестве размера одиночного канала.
Извлеките данные метки из входящего массива ячеек и объедините их вдоль второго измерения в категориальный массив.
Одноконтурное кодирование категориальных меток в числовые массивы. Кодирование в первом измерении создает закодированный массив, который соответствует форме сетевого вывода.
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
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
Вы щелкнули по ссылке, которая соответствует команде MATLAB:
Выполните эту команду, введя её в командном окне MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.