Хранилища данных для глубокого обучения

Хранилища данных в MATLAB® удобный способ работать с и представлять наборы данных, которые являются слишком большими, чтобы уместиться в памяти одновременно. Поскольку глубокое обучение часто требует больших объемов данных, хранилища данных являются важной частью рабочего процесса глубокого обучения в MATLAB.

Выберите Datastore

Для многих приложений, самый легкий подход - это начать работу со встроенным хранилищем данных. Для получения дополнительной информации о доступных встроенных хранилищах данных, смотрите, Выбирают Datastore for File Format или Application. Однако только некоторые типы встроенных хранилищ данных могут использоваться непосредственно в качестве входа для сетевого обучения, валидации и вывода. Эти хранилища данных:

DatastoreОписаниеДополнительный необходимый тулбокс
ImageDatastoreDatastore для данных изображения'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 возвращает данные в необходимой форме.

Введите 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]}

Несколько входных слоев

Массив ячеек с (numInputs + 1) столбцы, где numInputs количество сетевых входных параметров.

Первый numInputs столбцы задают предикторы для каждого входа, и последний столбец задает ответы.

Распоряжение входных параметров дано InputNames свойство графика слоев layers.

Массив ячеек для сети с двумя входными параметрами и одним выходом.

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, является длиной последовательности.

1D последовательность изображений

h-by-c-by-s массив, где h и 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 функция не поддерживает сети с несколькими входными слоями последовательности.

Формат ответов зависит от типа задачи.

ЗадачаФормат ответов
КлассификацияКатегориальный скаляр
Регрессия

  • Скаляр

  • Числовой вектор

  • 3-D числовой массив, представляющий изображение

Классификация от последовательности к последовательности

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) предоставляет альтернативное решение соединения основанных на изображении данных в ImageDatastores, PixelLabelDatastores, и TransformedDatastores. randomPatchExtractionDatastore имеет несколько преимуществ перед соединением данных с помощью combine функция. А именно, случайный datastore экстракции закрашенной фигуры:

  • Обеспечивает простой способ извлечь закрашенные фигуры и из 2D и из 3-D данных, не требуя, чтобы вы реализовали пользовательскую операцию обрезки с помощью transform и combine

  • Обеспечивает простой способ сгенерировать несколько закрашенных фигур на изображение на мини-пакет, не требуя, чтобы вы задали пользовательскую операцию конкатенации с помощью transform.

  • Поддерживает эффективное преобразование между категориальными и числовыми данными при применянии преобразований изображений к категориальным данным

  • Поддержки параллельны обучению

  • Улучшает производительность путем кэширования изображений

Используйте Datastore для параллельной диспетчеризации обучения и фона

Хранилища данных, используемые для параллельного обучения или обучения мультиграфического процессора, должны быть 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'.

Смотрите также

| | | |

Связанные примеры

Больше о