Хранилища данных в MATLAB® являются удобным способом работы с и представления наборов данных, которые являются слишком большими, чтобы помещаться в памяти в одно время. Поскольку глубокое обучение часто требует больших объемов данных, хранилища данных являются важной частью рабочего процесса глубокого обучения в MATLAB.
Для многих приложений самый легкий подход - начать со встроенное хранилище данных. Дополнительные сведения о доступных встроенных хранилищах данных см. в разделе Выбор Datastore для формата файла или приложения. Однако только некоторые типы встроенных хранилищ данных могут использоваться непосредственно в качестве входов для сетевого обучения, валидации и вывода. Эти хранилища данных:
Datastore | Описание | Требуется дополнительный тулбокс |
---|---|---|
ImageDatastore | Datastore для данных изображений | ничего |
AugmentedImageDatastore | Datastore для изменения размера и увеличения обучающих изображений Datastore недетерминирован | ничего |
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 для блочного чтения и обработки данных об изображениях, включая большие изображения, которые не помещаются в памяти | Image Processing Toolbox |
DenoisingImageDatastore (Набор Image Processing Toolbox) | Datastore, для обучения изображения, деноидирующего глубокую нейронную сеть Datastore недетерминирован | Image Processing Toolbox |
Другие встроенные хранилища данных могут использоваться в качестве входов для глубокого обучения, но данные, считанные из этих хранилищ данных, должны быть предварительно обработаны в формате, необходимом для нейронной сети для глубокого обучения. Для получения дополнительной информации о необходимом формате считанных данных смотрите Input Datastore для обучения, валидации и вывода. Дополнительные сведения о том, как выполнить предварительную обработку данных, считанных из хранилищ данных, см. в разделах Преобразование и Объединение хранилищ данных.
Для некоторых приложений может не быть встроенного хранилища данных, который хорошо подходит для ваших данных. Для этих задач можно создать пользовательский datastore. Для получения дополнительной информации см. Раздел «Разработка пользовательского Datastore». Все пользовательские хранилища данных являются допустимыми входами для глубокого обучения интерфейсов, пока read
функция пользовательского datastore возвращает данные в необходимой форме.
Datastores являются допустимыми входами в 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
функция для ds
datastore.
Сетевая архитектура | Выход 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]} |
Формат предикторов зависит от типа данных.
Данные | Формат предикторов |
---|---|
2-D изображение | h -by w -by c числовой массив, где h, w и c являются высотой, шириной и количеством каналов изображения, соответственно. |
3-D изображение | h w d c числовым массивом, где h, w, d, и c высота, ширина, глубина и количество каналов изображения, соответственно. |
Векторная последовательность | c -by - s матрица, где c - количество функций последовательности, а s - длина последовательности. |
2-D последовательности изображений | 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 вектор-на-1, где c количество функций. |
Для предикторов, возвращенных в таблицах, элементы должны содержать числовой скаляр, числовой вектор-строку или массив ячеек 1 на 1, содержащий числовой массив.
trainNetwork
функция не поддерживает сети с несколькими входными слоями последовательности.
Формат ответов зависит от типа задачи.
Задача | Формат ответов |
---|---|
Классификация | Категориальный скаляр |
Регресс |
|
Классификация последовательность-последовательность | 1-by - 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, используйте transform
и задайте базовый datastore и преобразование.
Для сложных преобразований, включающих несколько операций предварительной обработки, задайте полный набор преобразований в своей собственной функции. Затем задайте указатель на вашу функцию как @fcn
аргумент transform
. Для получения дополнительной информации смотрите Создание функций в файлах.
Для простых преобразований, которые могут быть выражены в одной строке кода, можно задать указатель на анонимную функцию как @fcn
аргумент transform
. Для получения дополнительной информации см. «Анонимные функции».
Указатель на функцию предусмотрен для transform
необходимо принять входные данные в том же формате, что и возвращенные read
функция базового datastore.
Пример: Преобразуйте Image 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
. Комбинированный imdsTrain datastore
возвращает данные как массив ячеек с двумя столбцами.
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
с. А randomPatchExtractionDatastore
имеет несколько преимуществ по сравнению с ассоциацией данных с помощью combine
функция. В частности, datastore случайного извлечения закрашенных фигур:
Предоставляет простой способ извлечения закрашенных фигур как из 2-D, так и из 3-D данных, не требуя от вас реализации пользовательской операции кадрирования с помощью transform
и combine
Предоставляет простой способ генерирования нескольких закрашенных фигур на изображение в мини-пакете, не требуя, чтобы вы определяли пользовательскую операцию конкатенации с помощью transform
.
Поддерживает эффективное преобразование между категориальными и числовыми данными при применении преобразований изображения в категориальные данные
Поддерживает параллельное обучение
Повышает эффективность за счет кэширования изображений
Хранилища данных, используемые для параллельного обучения или обучения с мультиграфическим процессором, должны быть разделяемыми. Чтобы определить, является ли datastore разделяемым, используйте функцию isPartitionable
. Задайте параллельное или мультиграфическое обучение с помощью '
Аргумент пары "имя-значение" из ExecutionEnvironment
'trainingOptions
. Для параллельного обучения или использования одного или нескольких графических процессоров требуется Parallel Computing Toolbox™.
Многие встроенные хранилища данных уже разделяются, потому что они поддерживают partition
функция. Использование transform
и combine
функции со встроенными хранилищами данных часто поддерживают поддержку для параллельного и мультиграфический процессор обучения.
Если вам нужно создать пользовательский datastore, который поддерживает параллельное или мультиграфическое обучение, то ваш datastore должен реализовать matlab.io.datastore.Partitionable
класс.
Разделяемые хранилища данных поддерживают чтение обучающих данных с помощью фоновой диспетчеризации. Фоновая передача данных очереди в памяти во время работы графический процессор. Задайте фоновое отправление с помощью '
Аргумент пары "имя-значение" из DispatchInBackground
'trainingOptions
. Для фоновой диспетчеризации требуется Parallel Computing Toolbox.
При параллельном обучении хранилища данных не поддерживают указание '
Аргумент пары "имя-значение" из Shuffle
'trainingOptions
как 'none'
.
combine
| read
| trainingOptions
| trainNetwork
| transform