Хранилища данных в MATLAB® являются удобным способом работать с и представлять наборы данных, которые являются слишком большими, чтобы уместиться в памяти одновременно. Поскольку глубокое обучение часто требует больших объемов данных, хранилища данных являются важной частью рабочего процесса глубокого обучения в MATLAB.
Для многих приложений, самый легкий подход - это начать работу со встроенным хранилищем данных. Для получения дополнительной информации о доступных встроенных хранилищах данных, смотрите, Выбирают Datastore for File Format или Application. Однако только некоторые типы встроенных хранилищ данных могут использоваться непосредственно в качестве входа для сетевого обучения, валидации и вывода. Эти хранилища данных:
Datastore | Описание | Дополнительный необходимый тулбокс |
---|---|---|
ImageDatastore | Datastore для данных изображения | 'none' |
AugmentedImageDatastore | Datastore для изменения размеров и увеличения учебных изображений Datastore недетерминирован | 'none' |
PixelLabelDatastore (Computer Vision Toolbox) | Datastore для данных о пиксельных метках | Computer Vision Toolbox™ |
PixelLabelImageDatastore (Computer Vision Toolbox) | Datastore для того, чтобы обучить сети семантической сегментации Datastore недетерминирован | Computer Vision Toolbox |
boxLabelDatastore (Computer Vision Toolbox) | Datastore для ограничительной рамки помечает данные | Computer Vision Toolbox |
RandomPatchExtractionDatastore (Image Processing Toolbox) | Datastore для извлечения случайных закрашенных фигур из основанных на изображении данных Datastore недетерминирован | Image Processing Toolbox™ |
blockedImageDatastore (Image Processing Toolbox) | Datastore для blockwise чтение и обработка данных изображения, включая большие изображения, которые не умещаются в памяти | Image Processing Toolbox |
DenoisingImageDatastore (Image Processing Toolbox) | Datastore, чтобы обучить глубокую нейронную сеть шумоподавления изображений Datastore недетерминирован | Image Processing Toolbox |
Другие встроенные хранилища данных могут использоваться в качестве входа для глубокого обучения, но данные, считанные из этих хранилищ данных, должны быть предварительно обработаны в формат, требуемый нейронной сетью для глубокого обучения. Для получения дополнительной информации о требуемом формате считанных данных смотрите Входной Datastore для Обучения, Валидации и Вывода. Для получения дополнительной информации о том, как предварительно обработать данные, считанные из хранилищ данных, смотрите Хранилища данных Преобразования и Объединения.
Для некоторых приложений не может быть типа встроенного хранилища данных, который соответствует вашим данным хорошо. Для этих проблем можно создать пользовательский datastore. Для получения дополнительной информации смотрите, Разрабатывают Пользовательский Datastore. Все пользовательские хранилища данных являются допустимыми входными параметрами к интерфейсам глубокого обучения пока read
функция пользовательского datastore возвращает данные в необходимой форме.
Хранилища данных являются допустимыми входными параметрами в Deep Learning Toolbox™ для обучения, валидации и вывода.
Можно использовать datastore изображений или другие типы datastore как источник обучающих данных когда обучение с помощью trainNetwork
функция. Чтобы использовать datastore для валидации, используйте '
аргумент пары "имя-значение" в ValidationData
'trainingOptions
.
Быть допустимым входом для обучения или валидации, read
функция datastore должна возвратить данные или как массив ячеек или как таблицу (за исключением ImageDatastore
объекты, которые могут вывести числовые массивы и пользовательские мини-пакетные хранилища данных, которые должны вывести таблицы).
Для сетей с одним входом таблица или массив ячеек, возвращенный datastore, должны иметь два столбца. Первый столбец данных представляет входные параметры сети, и второй столбец данных представляет ответы. Каждая строка данных представляет отдельное наблюдение. Для ImageDatastore
только, trainNetwork
и trainingOptions
поддержите данные, возвращенные как целочисленные массивы и массив ячеек отдельного столбца целочисленных массивов.
Чтобы использовать datastore для сетей с несколькими входными слоями, используйте combine
и transform
функции, чтобы создать datastore, который выводит массив ячеек с (numInputs
+ 1) столбцы, где numInputs
количество сетевых входных параметров. В этом случае, первый numInputs
столбцы задают предикторы для каждого входа, и последний столбец задает ответы. Распоряжение входных параметров дано InputNames
свойство графика слоев layers
.
Следующая таблица показывает примеру выходные параметры вызова read
функция для datastore ds
.
Сетевая архитектура | Datastore Выход | Пример Выход |
---|---|---|
Один входной слой | Таблица или массив ячеек с двумя столбцами. Первые и вторые столбцы задают предикторы и ответы, соответственно. Табличными элементами должны быть скаляры, векторы-строки или массивы ячеек 1 на 1, содержащие числовой массив. Пользовательские мини-пакетные хранилища данных должны вывести таблицы. | Таблица для сети с одним входом и одним выходом: data = read(ds) data = 4×2 table Predictors Response __________________ ________ {224×224×3 double} 2 {224×224×3 double} 7 {224×224×3 double} 9 {224×224×3 double} 9 |
Массив ячеек для сети с одним входом и одним выходом: data = read(ds) data = 4×2 cell array {224×224×3 double} {[2]} {224×224×3 double} {[7]} {224×224×3 double} {[9]} {224×224×3 double} {[9]} | ||
Несколько входных слоев | Массив ячеек с ( Первый Распоряжение входных параметров дано | Массив ячеек для сети с двумя входными параметрами и одним выходом. data = read(ds) data = 4×3 cell array {224×224×3 double} {128×128×3 double} {[2]} {224×224×3 double} {128×128×3 double} {[2]} {224×224×3 double} {128×128×3 double} {[9]} {224×224×3 double} {128×128×3 double} {[9]} |
Формат предикторов зависит от типа данных.
Данные | Формат предикторов |
---|---|
2D изображение | h-by-w-by-c числовой массив, где h, w и c являются высотой, шириной и количеством каналов изображения, соответственно. |
3-D изображение | h-by-w-by-d-by-c числовой массив, где h, w, d и c являются высотой, шириной, глубиной и количеством каналов изображения, соответственно. |
Векторная последовательность | c-by-s матрица, где c является количеством функций последовательности и s, является длиной последовательности. |
2D последовательность изображений | h-by-w-by-c-by-s массив, где h, w и c соответствуют высоте, ширине, и количеству каналов изображения, соответственно, и s, является длиной последовательности. Каждая последовательность в мини-пакете должна иметь ту же длину последовательности. |
3-D последовательность изображений | h-by-w-by-d-by-c-by-s массив, где h, w, d и c соответствуют высоте, ширине, глубине, и количеству каналов изображения, соответственно, и s, является длиной последовательности. Каждая последовательность в мини-пакете должна иметь ту же длину последовательности. |
Функции | c-by-1 вектор-столбец, где c является количеством функций. |
Для предикторов, возвращенных в таблицах, элементы должны содержать числовой скаляр, числовой вектор-строку или массив ячеек 1 на 1, содержащий числовой массив.
trainNetwork
функция не поддерживает сети с несколькими входными слоями последовательности.
Формат ответов зависит от типа задачи.
Задача | Формат ответов |
---|---|
Классификация | Категориальный скаляр |
Регрессия |
|
Классификация от последовательности к последовательности | 1 s последовательностью категориальных меток, где s является длиной последовательности соответствующей последовательности предиктора. |
Регрессия от последовательности к последовательности | R-by-s матрица, где R является количеством ответов и s, является длиной последовательности соответствующей последовательности предиктора. |
Для ответов, возвращенных в таблицах, элементами должен быть категориальный скаляр, числовой скаляр, числовой вектор-строка или массив ячеек 1 на 1, содержащий числовой массив.
Для использования вывода predict
, classify
, и activations
, datastore только требуется, чтобы давать к столбцам, соответствующим предикторам. Функции вывода используют первый NumInputs
столбцы и игнорируют последующие слои, где NumInputs
количество сетевых входных слоев.
Datastore может возвратить любое количество строк (наблюдения) для каждого вызова read
. Функционирует такой как trainNetwork
, predict
, classify
, и activations
это принимает хранилища данных и поддержку, задающую 'MiniBatchSize'
вызвать read
так много раз, как необходимо, чтобы сформировать полные мини-пакеты данных. Когда эти функции формируют мини-пакеты, они используют внутренние очереди в памяти, чтобы хранить данные о чтении. Например, если datastore последовательно возвращает 64 строки на вызов read
и MiniBatchSize
128
, затем сформировать каждый мини-пакет данных требует двух вызовов read
.
Для лучшей эффективности во время выполнения рекомендуется сконфигурировать хранилища данных, таким образом что количество наблюдений, возвращенных read
равно 'MiniBatchSize'
. Для хранилищ данных, которые имеют 'ReadSize'
свойство, набор 'ReadSize'
изменить количество наблюдений, возвращенных datastore для каждого вызова read
.
Глубокое обучение часто требует, чтобы данные были предварительно обработаны и увеличены, прежде чем данные будут в соответствующей форме, чтобы ввести к сети. transform
и combine
функции datastore полезны в подготовке данных, которые будут поданы в сеть.
Чтобы использовать datastore для сетей с несколькими входными слоями, используйте combine
и transform
функции, чтобы создать datastore, который выводит массив ячеек с (numInputs
+ 1) столбцы, где numInputs
количество сетевых входных параметров. В этом случае, первый numInputs
столбцы задают предикторы для каждого входа, и последний столбец задает ответы. Распоряжение входных параметров дано InputNames
свойство графика слоев layers
.
Преобразованный datastore применяет конкретное преобразование данных к базовому datastore при чтении данных. Чтобы создать преобразованный datastore, используйте transform
функционируйте и задайте базовый datastore и преобразование.
Для комплексных преобразований, включающих несколько операций предварительной обработки, задайте полный набор преобразований в вашей собственной функции. Затем задайте указатель на свою функцию как @fcn
аргумент transform
. Для получения дополнительной информации смотрите, Создают Функции в Файлах.
Для простых преобразований, которые могут быть описаны в одной строке кода, можно задать указатель на анонимную функцию как @fcn
аргумент transform
. Для получения дополнительной информации см. Анонимные функции.
Указатель на функцию предоставляется 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);
Задайте функцию преобразования, preprocessForTraining
. Вход к функции является пакетом данных, 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
функционируйте сопоставляет несколько хранилищ данных. Работа на получившемся CombinedDatastore
, такой как сброс datastore, выполняет ту же операцию на всех базовых хранилищах данных. Вызов read
функция объединенного datastore читает один пакет данных изо всех хранилищ данных лежания в основе N, которые должны возвратить то же количество наблюдений. Чтение от объединенного datastore возвращает горизонтально конкатенированные результаты в N - массив ячейки столбца, который подходит для обучения и валидации. Перестановка объединенного datastore приводит к идентичному рандомизированному упорядоченному расположению файлов в базовых хранилищах данных.
Например, если вы обучаете сеть регрессии от изображения к изображению, затем можно создать обучающий набор данных путем объединения двух хранилищ данных изображений. Этот пример кода демонстрирует объединение двух хранилищ данных изображений под названием 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
(Image Processing Toolbox) предоставляет альтернативное решение соединения основанных на изображении данных в ImageDatastore
s, PixelLabelDatastore
s, и TransformedDatastore
s. randomPatchExtractionDatastore
имеет несколько преимуществ перед соединением данных с помощью combine
функция. А именно, случайный datastore экстракции закрашенной фигуры:
Обеспечивает простой способ извлечь закрашенные фигуры и из 2D и из 3-D данных, не требуя, чтобы вы реализовали пользовательскую операцию обрезки с помощью transform
и combine
Обеспечивает простой способ сгенерировать несколько закрашенных фигур на изображение на мини-пакет, не требуя, чтобы вы задали пользовательскую операцию конкатенации с помощью transform
.
Поддерживает эффективное преобразование между категориальными и числовыми данными при применянии преобразований изображений к категориальным данным
Поддержки параллельны обучению
Улучшает производительность путем кэширования изображений
Хранилища данных, используемые для параллельного обучения или обучения мультиграфического процессора, должны быть partitionable. Чтобы определить, partitionable ли datastore, используйте функцию isPartitionable
. Задайте параллель или обучение мультиграфического процессора использование '
аргумент пары "имя-значение" ExecutionEnvironment
'trainingOptions
. Обучение параллельно или использование одного или несколько графических процессоров требуют Parallel Computing Toolbox™.
Много встроенных хранилищ данных уже partitionable, потому что они поддерживают partition
функция. Используя transform
и combine
функции со встроенными хранилищами данных часто обеспечивают поддержку обучения мультиграфического процессора и параллели.
Если необходимо создать пользовательский datastore, который поддерживает параллель или обучение мультиграфического процессора, то datastore должен реализовать matlab.io.datastore.Partitionable
класс.
Поддержка хранилищ данных Partitionable, считывая обучающие данные с помощью фоновой диспетчеризации. Фоновые данные очередей диспетчеризации в памяти, в то время как графический процессор работает. Задайте фоновую диспетчеризацию с помощью '
аргумент пары "имя-значение" DispatchInBackground
'trainingOptions
. Фоновая диспетчеризация требует Parallel Computing Toolbox.
Когда обучение параллельно, хранилища данных не поддерживают определение '
аргумент пары "имя-значение" Shuffle
'trainingOptions
как 'none'
.
combine
| read
| trainingOptions
| trainNetwork
| transform