Хранилища данных в MATLAB® являются удобным способом работать с и представлять наборы данных, которые являются слишком большими, чтобы уместиться в памяти когда-то. Поскольку глубокое обучение часто требует больших объемов данных, хранилища данных являются важной частью рабочего процесса глубокого обучения в MATLAB.
Для многих приложений самый легкий подход должен запуститься со встроенного datastore. Для получения дополнительной информации о доступных встроенных хранилищах данных, смотрите, Выбирают Datastore for File Format или Application (MATLAB). Однако только некоторые типы встроенных хранилищ данных могут использоваться непосредственно в качестве входа для сетевого обучения, валидации и вывода. Эти хранилища данных:
RandomPatchExtractionDatastore
(требует Image Processing Toolbox™),
PixelLabelImageDatastore
(требует Computer Vision Toolbox™),
DenoisingImageDatastore
(требует Image Processing Toolbox),
Другие встроенные хранилища данных могут использоваться в качестве входа для глубокого обучения, но данные, считанные из этих хранилищ данных, должны быть предварительно обработаны в формат, требуемый нейронной сетью для глубокого обучения. Для получения дополнительной информации о требуемом формате считанных данных смотрите Входной Datastore для Обучения, Валидации и Вывода. Для получения дополнительной информации о том, как предварительно обработать данные, считанные из хранилищ данных, смотрите Хранилища данных Преобразования и Объединения.
Для некоторых приложений не может быть встроенного типа хранилища данных, который соответствует вашим данным хорошо. Для этих проблем можно создать пользовательский datastore. Для получения дополнительной информации смотрите, Разрабатывают Пользовательский Datastore (MATLAB). Все пользовательские хранилища данных являются допустимыми входными параметрами к интерфейсам глубокого обучения, пока функция read
пользовательского datastore возвращает данные в необходимой форме 2D столбца.
Хранилища данных являются допустимыми входными параметрами в Deep Learning Toolbox™ для обучения, валидации и вывода.
Чтобы использовать datastore изображений в качестве источника данных тренировки, используйте аргумент imds
trainNetwork
. Чтобы использовать все другие типы datastore как источник данных тренировки, используйте ds аргумент trainNetwork
. Чтобы использовать datastore для валидации, используйте аргумент пары "имя-значение"
в 'ValidationData'
trainingOptions
.
Чтобы быть допустимым входом для обучения или валидации, функция read
datastore (за исключением ImageDatastore
) должна возвратить данные или как массив 2D ячейки столбца или как таблицу 2D столбца. Первый столбец данных представляет входные параметры сети, и второй столбец данных представляет ответы. Каждая строка данных представляет отдельное наблюдение. Для ImageDatastore
только, trainNetwork
и trainingOptions
поддерживают данные, возвращенные как целочисленные массивы и массив ячеек отдельного столбца целочисленных массивов.
Таблица показывает демонстрационный вывод вызывания функции read
для datastore ds
.
Формат считанных данных | Демонстрационный Вывод |
---|---|
Массив 2D ячейки столбца |
data = read(ds) data = 4×2 cell array {28×28 double} {[7]} {28×28 double} {[7]} {28×28 double} {[9]} {28×28 double} {[9]} |
Таблица 2D столбца |
data = read(ds) data = 4×2 table input response ______________ ________ {28×28 double} 7 {28×28 double} 7 {28×28 double} 9 {28×28 double} 9 |
Для вывода с помощью predict
, classify
и activations
, datastore только требуется, чтобы приводить к одному столбцу. Функции вывода игнорируют дополнительные столбцы данных вне первого.
Datastore может возвратить любое количество строк (наблюдения) для каждого вызова read
. Функционирует, такие как trainNetwork
, predict
, classify
и activations
, которые принимают хранилища данных и поддержку, задающую, 'MiniBatchSize'
вызывают read
так много раз, как необходимо, чтобы сформировать полные мини-пакеты данных. Когда эти функции формируют мини-пакеты, они используют внутренние очереди в памяти, чтобы хранить данные о чтении. Например, если datastore последовательно возвращает 64 строки на вызов read
, и MiniBatchSize
является 128
, то сформироваться, каждый мини-пакет данных требует двух вызовов read
.
Для лучшей производительности во время выполнения рекомендуется сконфигурировать хранилища данных, таким образом, что количество наблюдений, возвращенных read
, равно 'MiniBatchSize'
. Для хранилищ данных, которые имеют свойство 'ReadSize'
, установите 'ReadSize'
изменять количество наблюдений, возвращенных datastore для каждого вызова read
.
Глубокое обучение часто требует, чтобы данные были предварительно обработаны и увеличены, прежде чем данные будут в соответствующей форме, чтобы ввести к сети. transform
и функции combine
datastore полезны в подготовке данных, которые будут поданы в сеть.
Функция transform
создает измененную форму datastore, названного underlying datastore, путем преобразования данных, считанных базовым datastore.
Для комплексных преобразований, включающих несколько операций предварительной обработки, задайте полный набор преобразований в вашей собственной функции. Затем задайте указатель на свою функцию в качестве аргумента @fcn
transform
. Для получения дополнительной информации смотрите, Создают Функции в Файлах (MATLAB).
Для простых преобразований, которые могут быть выражены в одной строке кода, можно задать указатель на анонимную функцию в качестве аргумента @fcn
transform
. Для получения дополнительной информации см. Анонимные функции (MATLAB).
Указатель на функцию, предоставленный transform
, должен принять входные данные в том же формате, как возвращено функцией read
базового datastore.
Пример: преобразуйте Datastore изображений, чтобы обучить сеть классификации цифр
Этот пример использует функцию transform
, чтобы создать набор обучающих данных, в котором рандомизировал 90 вращений степени, добавляется к каждому изображению в datastore изображений. Передайте получившийся TransformedDatastore
trainNetwork
, чтобы обучить простую сеть классификации цифр.
Создайте datastore изображений, содержащий изображения цифры.
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet', ... 'nndemos','nndatasets','DigitDataset'); imds = imageDatastore(digitDatasetPath, ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames');
Установите мини-пакетный размер, равный ReadSize
datastore изображений.
miniBatchSize = 128; imds.ReadSize = miniBatchSize;
Преобразуйте изображения в datastore изображений путем добавления, рандомизировал 90 вращений степени. Функция преобразования, preprocessForTraining
, задана в конце этого примера.
dsTrain = transform(imds,@preprocessForTraining,'IncludeInfo',true)
dsTrain = TransformedDatastore with properties: UnderlyingDatastore: [1×1 matlab.io.datastore.ImageDatastore] Transforms: {@preprocessForTraining} IncludeInfo: 1
Задайте слои сети и опций обучения, затем обучите сеть с помощью преобразованного datastore dsTrain
в качестве источника данных.
layers = [ ... imageInputLayer([28 28 1],'Normalization','none') convolution2dLayer(5,20) reluLayer() maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(10); softmaxLayer() classificationLayer()]; options = trainingOptions('adam', ... 'Plots','training-progress', ... 'MiniBatchSize',miniBatchSize); net = trainNetwork(dsTrain,layers,options);
Задайте функцию, которая выполняет желаемые преобразования данных, data
, считанного из базового datastore. Функциональные циклы посредством каждого чтения отображают, и выполняет рандомизированное вращение, затем возвращает преобразованное изображение и соответствующую метку как массив 2D ячейки столбца как ожидалось trainNetwork
.
function [dataOut,info] = preprocessForTraining(data,info) numRows = size(data,1); dataOut = cell(numRows,2); for idx = 1:numRows % Randomized 90 degree rotation imgOut = rot90(data{idx,1},randi(4)-1); % Return the label from info struct as the % second column in dataOut. dataOut(idx,:) = {imgOut,info.Label(idx)}; end end
Функция combine
сопоставляет два хранилища данных той же длины, чтобы создать 2D формат столбца, ожидаемый данных об обучении и валидации. Объединение хранилищ данных поддерживает четность между хранилищами данных. Каждый вызов функции read
получившегося CombinedDatastore
возвращает данные из соответствующих частей базовых хранилищ данных.
Например, если вы - обучение изображение в, отображаете сеть регрессии, затем можно создать обучающий набор данных путем объединения двух хранилищ данных изображений. Этот пример кода демонстрирует объединение двух хранилищ данных изображений под названием imdsX
и imdsY
. Хранилища данных изображений возвращают данные как массив ячеек, поэтому объединенный datastore, imdsTrain
возвращает данные как массив 2D ячейки столбца.
imdsX = imageDatastore(___); imdsY = imageDatastore(___); imdsTrain = combine(imdsX,imdsY)
imdsTrain = CombinedDatastore with properties: UnderlyingDatastores: {1×2 cell}
Хранилища данных, используемые для параллельного обучения или обучения мультиграфического процессора, должны быть partitionable. Задайте параллель или обучение мультиграфического процессора использование аргумента пары "имя-значение"
'ExecutionEnvironment'
trainingOptions
.
Много встроенных хранилищ данных уже partitionable, потому что они поддерживают функцию partition
. Преобразованные хранилища данных partitionable, если их базовый datastore partitionable. Используя функцию transform
со встроенными хранилищами данных часто поддерживает поддержку обучения мультиграфического процессора и параллели.
Если необходимо создать пользовательский datastore, который поддерживает параллель или обучение мультиграфического процессора, то datastore должен реализовать класс matlab.io.datastore.Partitionable
.
Некоторая partitionable поддержка хранилищ данных, считывая данные тренировки с помощью асинхронного чтения упреждающей выборки, который данные очередей в памяти, в то время как графический процессор работает. Задайте чтение упреждающей выборки с помощью аргумента пары "имя-значение"
'DispatchInBackground'
trainingOptions
. Чтение упреждающей выборки требует Parallel Computing Toolbox™.
Существуют некоторые ограничения при использовании хранилищ данных с параллельным обучением, обучением мультиграфического процессора, и выбирают оптимизацию чтения с упреждением.
Хранилища данных не поддерживают определение аргумента пары "имя-значение"
'Shuffle'
trainingOptions
как 'none'
.
Объединенные хранилища данных не partitionable и поэтому не поддерживают параллельное обучение, обучение мультиграфического процессора или чтение упреждающей выборки.
combine
| read
| trainNetwork
| trainingOptions
| transform