Хранилища данных в MATLAB® являются удобным способом работать с и представлять наборы данных, которые являются слишком большими, чтобы уместиться в памяти когда-то. Поскольку глубокое обучение часто требует больших объемов данных, хранилища данных являются важной частью рабочего процесса глубокого обучения в MATLAB.
Для многих приложений самый легкий подход должен запуститься со встроенного datastore. Для получения дополнительной информации о доступных встроенных хранилищах данных, смотрите, Выбирают Datastore for File Format или Application (MATLAB). Однако только некоторые типы встроенных хранилищ данных могут использоваться непосредственно в качестве входа для сетевого обучения, валидации и вывода. Эти хранилища данных:
randomPatchExtractionDatastore
(требует Image Processing Toolbox™),
DenoisingImageDatastore
(требует Image Processing Toolbox),
boxLabelDatastore
(требует Computer Vision Toolbox™),
PixelLabelImageDatastore
(требует Computer Vision Toolbox),
Другие встроенные хранилища данных могут использоваться в качестве входа для глубокого обучения, но данные, считанные из этих хранилищ данных, должны быть предварительно обработаны в формат, требуемый нейронной сетью для глубокого обучения. Для получения дополнительной информации о требуемом формате считанных данных смотрите Входной Datastore для Обучения, Валидации и Вывода. Для получения дополнительной информации о том, как предварительно обработать данные, считанные из хранилищ данных, смотрите Хранилища данных Преобразования и Объединения.
Для некоторых приложений не может быть встроенного типа хранилища данных, который соответствует вашим данным хорошо. Для этих проблем можно создать пользовательский datastore. Для получения дополнительной информации смотрите, Разрабатывают Пользовательский Datastore (MATLAB). Все пользовательские хранилища данных являются допустимыми входными параметрами к интерфейсам глубокого обучения пока read
функция пользовательского datastore возвращает данные в необходимой форме.
Хранилища данных являются допустимыми входными параметрами в Deep Learning Toolbox™ для обучения, валидации и вывода.
Чтобы использовать datastore изображений в качестве источника обучающих данных, используйте imds
аргумент trainNetwork
. Чтобы использовать все другие типы datastore как источник обучающих данных, используйте ds
аргумент trainNetwork
. Чтобы использовать datastore в валидации, используйте '
аргумент пары "имя-значение" в ValidationData
'trainingOptions
.
Быть допустимым входом для обучения или валидации, read
функция datastore (за исключением ImageDatastore
) должен возвратить данные или как массив ячеек или как таблицу.
Для сетей с одним входом таблица или массив ячеек, возвращенный datastore, должны иметь два столбца. Первый столбец данных представляет входные параметры сети, и второй столбец данных представляет ответы. Каждая строка данных представляет отдельное наблюдение. Для ImageDatastore
только, trainNetwork
и trainingOptions
поддержите данные, возвращенные как целочисленные массивы и массив ячеек отдельного столбца целочисленных массивов.
Для сетей с несколькими входными параметрами datastore должен быть объединенным или преобразованным datastore, который возвращает массив ячеек с (numInputs
+1) столбцы, содержащие предикторы и ответы, где numInputs
количество сетевых входных параметров и numResponses
количество ответов. Для i
меньше чем или равный numInputs
, i
элемент th массива ячеек соответствует входу layers.InputNames(i)
, где layers
график слоя, задающий сетевую архитектуру. Последний столбец массива ячеек соответствует ответам.
Таблица показывает демонстрационный выход вызова 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 | |
Несколько - вход | (numInputs +1) - массив ячейки столбца |
data = read(ds) data = 4×3 cell array {28×28 double} {128×128 double} {[7]} {28×28 double} {128×128 double} {[7]} {28×28 double} {128×128 double} {[9]} {28×28 double} {128×128 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 полезны в подготовке данных, которые будут поданы в сеть.
Для сетей с несколькими входными параметрами используйте объединенный 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. Функциональные циклы посредством каждого чтения отображают, и выполняет рандомизированное вращение, затем возвращает преобразованное изображение и соответствующую метку как массив ячеек как ожидалось 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
функционируйте сопоставляет два хранилища данных той же длины, чтобы создать формат, ожидаемый данных об обучении и валидации. Объединение хранилищ данных обеспечивает четность между хранилищами данных. Каждый вызов read
функция получившегося CombinedDatastore
возвращает данные из соответствующих частей базовых хранилищ данных.
Например, если вы - обучение изображение в, отображаете сеть регрессии, затем можно создать обучающий набор данных путем объединения двух хранилищ данных изображений. Этот пример кода демонстрирует объединение двух хранилищ данных изображений под названием imdsX
и imdsY
. Хранилища данных изображений возвращают данные как массив ячеек, поэтому объединенный datastore imdsTrain
возвращает данные как массив 2D ячейки столбца.
imdsX = imageDatastore(___); imdsY = imageDatastore(___); imdsTrain = combine(imdsX,imdsY)
imdsTrain = CombinedDatastore with properties: UnderlyingDatastores: {1×2 cell}
Если у вас есть Image Processing Toolbox, то randomPatchExtractionDatastore
предоставляет альтернативное решение соединения основанных на изображении данных в ImageDatastore
s, PixelLabelDatastore
s, и TransformedDatastore
s с базовым типом любого из двух предыдущих хранилищ данных. randomPatchExtractionDatastore
имеет несколько преимуществ перед соединением данных с помощью combine
функция. А именно, случайный datastore экстракции закрашенной фигуры:
Обеспечивает простой способ извлечь закрашенные фигуры и из 2D и из 3-D данных, не требуя, чтобы вы реализовали пользовательскую операцию обрезки с помощью transform
и combine
Обеспечивает простой способ сгенерировать несколько закрашенных фигур на изображение на мини-пакет, не требуя, чтобы вы задали пользовательскую операцию конкатенации с помощью transform
.
Поддерживает эффективное преобразование между категориальными и числовыми данными при применянии преобразований изображений к категориальным данным
Поддержки параллельны обучению
Улучшает производительность путем кэширования изображений
Хранилища данных, используемые в параллельном обучении или обучении мультиграфического процессора, должны быть 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